[PHP] Calculeren met UNIX_TIMESTAMP

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de volgende code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$var = "2003-03-04 23:33:15";
$binary = strtotime ($var) + (60*60*24*365);
$ascii   = strftime("%Y-%m-%d %H:%M:%S", $binary);


echo "<pre>";

echo "Input     : $var\n";
echo "Timestamp : $binary\n";
echo "Output    : $ascii";

echo "</pre>";
De output is als volgt:

code:
1
2
3
Input     : 2003-03-04 23:33:15
Timestamp : 1078353195
Output    : 2004-03-03 23:33:15
Ik ben nu al 4,5 uur aan het klootviolen maar kan geen enkele goede manier vinden om bij de UNIX_TIMESTAMP heel eenvoudig een jaar op te tellen! Zoals je hierboven ziet tel ik er 365 dagen bij op, maar eens in de 4 jaar levert dit problemen op ivm het zogenaamde schrikkeljaar. Er komt dan namelijk een dag tekort! (Net zoals in het voorbeeld het geval is, aangezien 29 februari 2004 weer een schrikkeljaar is en die datum precies in het voorbeeld valt...)

Is er bitte iemand die hier een goede oplossing voor heeft?

Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 16:22

pietje63

RTFM

een vraagje; waar haal je de input vandaan? is het niet mogelijk om DAAR al het jaar te scheiden en er dan een bij op te tellen?

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De input komt uit MySql. Ik wil de datum eruit halen, verschillende acties ondernemen op basis van zowel de oude als nieuwe datum en vervolgens MySql de nieuwe datum teruggeven.

Acties:
  • 0 Henk 'm!

  • Hagar
  • Registratie: Februari 2001
  • Laatst online: 20-03 20:39

Hagar

Diabootic

Nu ook zonder stropdas


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$var = "2003-03-04 23:33:15";

$year = intval( substr( $var, 0, 4 ) );
$year++;
$ascii = $year . substr($var, 4 );

echo "<pre>"; 

echo "Input     : $var\n"; 
echo "Output    : $ascii"; 

echo "</pre>";


output:
code:
1
2
Input     : 2003-03-04 23:33:15
Output    : 2004-03-04 23:33:15


succes

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey mfcer, bedankt! Het werkt inderdaad. Echter was dit niet de methode waar ik naar op zoek was. Dit is in feite hetzelfde als explode gebruiken, dat doorgaans toch niet tot de beste methode behoort.

Ik wil gewoon bij de basis al aan kunnen geven dat er een jaar bij op moet, zonder te exploden of substringen of wat dan ook. Met DATE en MKTIME zou het me lukken, mits het ging om de datum van heden, maar het gaat om een willekeurige datum uit MySql. Dan werkt het zaakje volgens mij toch iets anders.

Verder nog iemand die weet hoe je op een andere manier dan het optellen van 365 dagen een jaar vooruit kan gaan?? Ik heb op internet gezocht, maar kan nergens een geschikte class hiervoor vinden. Toevallig iemand die dat wel heeft kunnen vinden??

Een bestaande class is me net zo lief af...

Acties:
  • 0 Henk 'm!

Verwijderd

Als je de datums op een juiste manier hebt verwerkt in MySql (dus volgens het mysql date), kan je het jaar apart ophalen met een query (icm een alias, DATE_FORMAT). Hier kan je dan een jaar bij optellen en met behulp van mktime() (http://php.net/mktime) kan je dan simpel de timestamp van over een jaar teruggeven.

Acties:
  • 0 Henk 'm!

Verwijderd

het volgende zou moeten werken (heb hier geen php, dus kan het niet testen
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$var = "2003-03-04 23:33:15"; 
$year=strftime("%Y",strtotime ($var))
$addDays=365;
if($year%4==0) {
  if($year%100==0)
    if($year%400==0)
      $addDays++;
    }
  }
  else {
    $addDays++;
  }
}
$binary = strtotime ($var) + (60*60*24*$addDays); 
$ascii   = strftime("%Y-%m-%d %H:%M:%S", $binary);

[ Voor 93% gewijzigd door Verwijderd op 05-03-2003 08:38 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 05 maart 2003 @ 01:45:
mits het ging om de datum van heden, maar het gaat om een willekeurige datum uit MySql. Dan werkt het zaakje volgens mij toch iets anders.

En je verzuimt dan in de mysql manual te kijken, naar handige functies als Date_add ?
Hoewel ik nooit getest heb of ie rekening houdt met schrikkeljaren ;)

Ow en uit mysql kan je ook direct een unix_timestamp krijgen...

[ Voor 9% gewijzigd door ACM op 05-03-2003 09:18 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
I THINK WE HAVE A WINNER!!!
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$date = "2003-03-05 10:09:15";

$year=strftime("%Y", strtotime ($date));
$month=strftime("%m", strtotime ($date));
$day=strftime("%d", strtotime ($date));
$hrs=strftime("%H", strtotime ($date));
$mns=strftime("%M", strtotime ($date));
$sec=strftime("%S", strtotime ($date));

$year++;

$ascii = date("Y-m-d H:i:s", mktime ($hrs,$mns,$sec,$month,$day,$year));

echo "<pre>";

echo "Datum : $date\n";
echo "After : $ascii";

echo "</pre>";

De output wordt dan als volgt:
code:
1
2
Datum : 2003-03-05 10:09:15
After : 2004-03-05 10:09:15

Is er iemand die dit stukje code nog wat efficiënter weet te maken??

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:12

crisp

Devver

Pixelated

PHP:
1
2
$now = time();
$nextyear = strtotime('+1 year', $now);

:Y)

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op 05 maart 2003 @ 10:21:
PHP:
1
2
$now = time();
$nextyear = strtotime('+1 year', $now);

:Y)
Bovenstaande heb ik ook wel geprobeerd, echter werkt dit alleen met de HUIDIGE tijd en daar gaat het helaas niet om...

[ Voor 31% gewijzigd door Verwijderd op 05-03-2003 10:41 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

SCHREEUW NIET ZO
bovendien is die tip zeker wel nuttig. Dat hij de huidige time gebruikt boeit niet, het gaat erom dat ie een timestamp gebruikt. En ja, de waarde uit MySQL kun je ook converteren naar timestamp

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb verschillende timestamps gebruikt, maar hij gaat dan optellen bij de UNIX begintijd... 1 januari 1970 geloof ik... Ik krijg er dus telkens een waarde uit ergens in 1 januari 1971... Schijtzooi dus...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Volgens bovenstaande zou het volgende moeten werken:
PHP:
1
2
3
$input = "2003-03-05 10:09:15";
$unix = strtotime('+1 year', $input);
$output   = strftime("%Y-%m-%d %H:%M:%S", $unix);
Maar hier krijg ik dus van die 1971 getallen terug...

[ Voor 9% gewijzigd door Verwijderd op 05-03-2003 10:47 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:12

crisp

Devver

Pixelated

Verwijderd schreef op 05 March 2003 @ 10:47:
Volgens bovenstaande zou het volgende moeten werken:
PHP:
1
2
3
$input = "2003-03-05 10:09:15";
$unix = strtotime('+1 year', $input);
$output   = strftime("%Y-%m-%d %H:%M:%S", $unix);
Maar hier krijg ik dus van die 1971 getallen terug...
Je moet je $input eerst omzetten naar een timestamp:
PHP:
1
$unix = strtotime('+1 year', strtotime($input));

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
JE BENT HELEMAAL GENIAAL!! HAHA!! WOW!!

Na een hele nacht kloten eindelijk voor elkaar!!
PHP:
1
2
3
$date = "2003-03-05 10:09:15";
$unix = strtotime('+1 year', strtotime($date));
$output = strftime("%Y-%m-%d %H:%M:%S", $unix);
Levert de volgende output op
code:
1
2
3
Datum  : 2003-03-05 10:09:15
Unix   : 1078477755
Output : 2004-03-05 10:09:15

[ Voor 77% gewijzigd door Verwijderd op 05-03-2003 10:54 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:12

crisp

Devver

Pixelated

Je andere vraag (alweer weggehaald, maar wou je 'm niet onthouden):
PHP:
1
list($year,$month,$day,$hrs,$mns,$sec) = explode('-', strftime('%Y-%m-%d-%H-%M-%S', strtotime($date)));

:)

misschien dat date() nog iets sneller is, maar dat is niet echt boeiend denk.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

* ACM vraagt zich echt af wat er mis is met de mysql date/time functies.
Maar het zal wel aan mij liggen dat daar zo moeilijk voor gedaan moet worden in php 8)7

code:
1
2
select datum, date_add(datum, interval 1 year) as datum_incr, 
   unix_timestamp(date_add(datum, interval 1 year)) as datum_incr_tmstp from tabeldinges;

Is waarsch nog sneller ook ;)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:12

crisp

Devver

Pixelated

ACM schreef op 05 March 2003 @ 19:13:
* ACM vraagt zich echt af wat er mis is met de mysql date/time functies.
Maar het zal wel aan mij liggen dat daar zo moeilijk voor gedaan moet worden in php 8)7

code:
1
2
select datum, date_add(datum, interval 1 year) as datum_incr, 
   unix_timestamp(date_add(datum, interval 1 year)) as datum_incr_tmstp from tabeldinges;

Is waarsch nog sneller ook ;)
Wat de boer niet kent... ;)

Intentionally left blank

Pagina: 1