Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[PHP4/PHP5] time() functie verschillend?

Pagina: 1
Acties:

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 12-11 21:26
Recent ben ik overgestapt van PHP4 naar PHP5. Nu heb ik wat problemen m.b.t. tijdzones. In een database sloeg ik vaak timestamps op gegenereerd met de time() functie, het aantal seconden sinds 1-1-1970. Sinds de overgang naar PHP5 lijkt het alsof er iets is veranderd met de time() functie. Bij PHP5 is wordt het aantal seconden gereturned sinds 1-1-1970 (UTC). Kan het kloppen dat bij PHP4 het aantal seconden werd gereturned sinds 1-1-1970 CET (afh. van wat je zelf had ingesteld)? Uit de gegevens uit m'n database blijkt er ineens 2 uur verschil in te zitten, dus ik vermoed dat de werking van time() iets veranderd is. Ik kan hier echter nergens iets over vinden, waardoor ik twijfel of ik het bij het juiste eind heb.. Kan iemand hier iets zinnigs over zeggen voordat ik alle (oude) tijden in de database ga converteren?

Wat zou helpen: heeft iemand ergens een PHP4 install en kan onderstaande scriptje runnen? Dan heb ik al voldoende antwoord denk ik:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
echo "<br>";
date_default_timezone_set('Europe/Amsterdam'); echo "TZ => Europe/Amsterdam<br>";
$time = time();
echo "De huidige timestamp door time() is: " . $time . "<br>";
date_default_timezone_set('UTC'); echo "TZ => UTC<br>";
echo "$time unixtime in UTC weergegeven is: " . date("d-m-Y H:i:s", $time);echo "<br>";
date_default_timezone_set('Europe/Amsterdam'); echo "TZ => Europe/Amsterdam<br>";
echo "$time unixtime in CET weergegeven is: " . date("d-m-Y H:i:s", $time);echo "<br>";


echo "<br>";
date_default_timezone_set('UTC'); echo "TZ => UTC<br>";
$time = time();
echo "De huidige timestamp door time() is: " . $time . "<br>";
date_default_timezone_set('UTC'); echo "TZ => UTC<br>";
echo "$time unixtime in UTC weergegeven is: " . date("d-m-Y H:i:s", $time);echo "<br>";
date_default_timezone_set('Europe/Amsterdam'); echo "TZ => Europe/Amsterdam<br>";
echo "$time unixtime in CET weergegeven is: " . date("d-m-Y H:i:s", $time);echo "<br>";


geeft:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
TZ => Europe/Amsterdam
De huidige timestamp door time() is: 1221131643
TZ => UTC
1221131643 unixtime in UTC weergegeven is: 11-09-2008 11:14:03
TZ => Europe/Amsterdam
1221131643 unixtime in CET weergegeven is: 11-09-2008 13:14:03

TZ => UTC
De huidige timestamp door time() is: 1221131643
TZ => UTC
1221131643 unixtime in UTC weergegeven is: 11-09-2008 11:14:03
TZ => Europe/Amsterdam
1221131643 unixtime in CET weergegeven is: 11-09-2008 13:14:03

  • disjfa
  • Registratie: April 2001
  • Laatst online: 04-11 11:05

disjfa

be

http://nl3.php.net/time
Timestamp of the start of the request is available in $_SERVER['REQUEST_TIME'] since PHP 5.1.
:?

disjfa - disj·fa (meneer)
disjfa.nl


  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 12-11 21:26
Dank voor de reactie, maar dat heeft er denk ik niets mee te maken, dat is een extra opmerking in de documentatie.

[ Voor 18% gewijzigd door dirkpostma op 11-09-2008 13:26 ]


  • Jaap-Jan
  • Registratie: Februari 2001
  • Nu online
Wel raar dat je zegt in UTC, want op de pagina waar disjfa naar linkt, staat GMT. En daar staat ook niets over verschillen tussen PHP 4 en 5. Heeft PHP aparte settings voor timezones en staat daar misschien iets verkeerd? Het kan ook zijn dat het een bug was, maar dat zou je dan even na moeten zoeken.

En disjfa, wat je nou quote heeft niets met het probleem van TS te maken. :)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 12-11 21:26
UTC en GMT zijn toch hetzelfde..?

Mmm, bijna hetzelfde, op wat schrikkelsecondes na :-)
Wikipedia: UTC

Ik kan me voorstellen dat er een bug zit ergens.. maar aangezien ik er niets over kan vinden... erg vreemd...

Verwijderd

Je hebt 2 uur verschil , want Europe/Amsterdam is GMT+1, plus DST (daylight saving time).
Je script geeft dezelfde output met php4.3.10-22 overigens.

Weet je zeker dat je timezone-instelling van PHP4 overeenkomt met de instelling die je nu gebruikt in PHP5?

Overigens heb ik deze problemen niet gehad bij de overgang van PHP4->5.

[ Voor 39% gewijzigd door Verwijderd op 11-09-2008 13:38 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:41
Ik herken dit probleem ook niet, en ik heb met PHP 3 t/m 5 gewerkt. Voor zover ik weet is die PHP functie gewoon equivalent aan een call naar de POSIX C-functie time die altijd de absolute tijd in seconden sinds 1 januari 1970 geeft (maar zonder schikkelseconden) en dus niets met tijdzones doet.

edit:
Ik heb even in de PHP 4 en 5 source gezocht en in beide versies wordt de functie precies gedefineerd zoals ik al vermoedde:
C:
1
2
3
4
5
6
7
/* {{{ proto int time(void)
   Return current UNIX timestamp */
PHP_FUNCTION(time)
{
    RETURN_LONG((long)time(NULL));
}
/* }}} */

De functie is dus niet veranderd tussendoor; je probleem ligt elders.

[ Voor 37% gewijzigd door Soultaker op 11-09-2008 13:47 ]


  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 12-11 21:26
Ik heb het gevonden denk ik...

Ik heb gelogen in mijn openingspost: de tijden werden namelijk niet gegenereerd door time() maar door mktime(). Laat deze nou tijdzone-gevoelig zijn. Bij PHP4 had ik nooit een TZ ingesteld, ik deed alles in UTC denk ik. Nu heb ik ergens aan het begin van code staan dat het Europe/Amsterdam moet zijn, waardoor mktime() zich ineens anders gaat gedragen...

code:
1
2
3
4
5
6
7
date_default_timezone_set('UTC'); echo "TZ => UTC<br>";
$t = mktime(0,0,0,date('m', $time),1,date('Y',$time));
echo "$t is: " . date("d-m-Y H:i:s", $t);echo "<br>";

date_default_timezone_set('Europe/Amsterdam'); echo "TZ => Europe/Amsterdam<br>";
$t = mktime(0,0,0,date('m', $time),1,date('Y',$time));
echo "$t is: " . date("d-m-Y H:i:s", $t);echo "<br>";


geeft als resultaat:
code:
1
2
3
4
TZ => UTC
1220227200 is: 01-09-2008 00:00:00
TZ => Europe/Amsterdam
1220220000 is: 01-09-2008 00:00:00


...dat verklaart de zaak.

Apart dat als je het aan iemand vraagt je ineens tot heldere inzichten komt :) Ik heb er echt al uren op gezeten :) Ik ga er nu denk ik voor zorgen dat alles in UTC wordt opgeslagen en in CET wordt weergegeven.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dikke kans dat je nu ook een E_STRICT error negeert mbt het niet setten van een tz. ;)

{signature}

Pagina: 1