|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2004-09-15 16:43 UTC] schmidt_florian at f-24 dot com
Description:
------------
i have seen many bugs concerning this problem, but the latest stable php versions (4 and 5) still dont work correct.
echo gmdate("H,i,s, m,d,Y", gmmktime(02,00,01, 03,28,2004));
expected result: 02,00,01, 03,28,2004
result i got with v4.3.8 03,00,01, 03,28,2004
result i got with v5.0.1 03,00,01, 03,28,2004
so it is one hour off the wanted value.
v4.3.8 on a Linux 2.6.7 with libc6 2.3.2.ds1-13
v5.0.1 on a Linux 2.6.7-gentoo-r11 with glibc 2.3.4.20040808
timezone: CEST+DST (GMT+0200)
Reproduce code:
---------------
echo gmdate("H,i,s, m,d,Y", gmmktime(02,00,01, 03,28,2004));
Expected result:
----------------
02,00,01, 03,28,2004
Actual result:
--------------
03,00,01, 03,28,2004
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 18:00:02 2025 UTC |
Looks ok on my Debian laptop: php -r 'echo phpversion()."\n"; echo gmdate("H,i,s, m,d,Y", gmmktime(02,00,01, 03,28,2004));' 4.3.9RC2-dev 02,00,01, 03,28,2004 Since we are dealing with GMT, your timezone should be irrelevant.I can reproduce this for debian testing (php 4.3.10) and for gentoo (php 4.3.10). The problem apears only the day when switching from dst to no dst. On that day all input that is between 02:00:00-02:59:59 ist mapped to a timestamp which is 3600 seconds later (03:00:00-03:50:59). Here is my script to reproduce the behavoir: <?php echo "no dst --> dst<br>"; $ts=-1; gm_date_check(01,00,00,03,27,2005); gm_date_check(02,00,00,03,27,2005); gm_date_check(03,00,00,03,27,2005); gm_date_check(04,00,00,03,27,2005); echo "<p>"; echo "dst --> no dst<br>"; $ts=-1; gm_date_check(01,00,00,10,30,2005); gm_date_check(02,00,00,10,30,2005); gm_date_check(03,00,00,10,30,2005); gm_date_check(04,00,00,10,30,2005); function gm_date_check($hour,$minute,$second,$month,$day,$year) { global $ts,$tsold; echo "gmmktime($hour,$minute,$second,$month,$day,$year): " ; $tsold = $ts; $ts = gmmktime($hour,$minute,$second,$month,$day,$year,0) ; echo $ts ." | gmdate('r',$ts):".gmdate('r',$ts); if ($tsold>0) echo " | Diff: " . ($ts - $tsold); echo "<br>"; } ?> ==================OUTPUT============================== no dst --> dst gmmktime(0,0,0,3,27,2005): 1111885200 | gmdate('r',1111885200):Sun, 27 Mar 2005 01:00:00 +0000 gmmktime(1,0,0,3,27,2005): 1111888800 | gmdate('r',1111888800):Sun, 27 Mar 2005 02:00:00 +0000 | Diff: 3600 gmmktime(2,0,0,3,27,2005): 1111892400 | gmdate('r',1111892400):Sun, 27 Mar 2005 03:00:00 +0000 | Diff: 3600 gmmktime(3,0,0,3,27,2005): 1111896000 | gmdate('r',1111896000):Sun, 27 Mar 2005 04:00:00 +0000 | Diff: 3600 gmmktime(4,0,0,3,27,2005): 1111899600 | gmdate('r',1111899600):Sun, 27 Mar 2005 05:00:00 +0000 | Diff: 3600 dst --> no dst gmmktime(0,0,0,10,30,2005): 1130630400 | gmdate('r',1130630400):Sun, 30 Oct 2005 00:00:00 +0000 gmmktime(1,0,0,10,30,2005): 1130634000 | gmdate('r',1130634000):Sun, 30 Oct 2005 01:00:00 +0000 | Diff: 3600 gmmktime(2,0,0,10,30,2005): 1130637600 | gmdate('r',1130637600):Sun, 30 Oct 2005 02:00:00 +0000 | Diff: 3600 gmmktime(3,0,0,10,30,2005): 1130641200 | gmdate('r',1130641200):Sun, 30 Oct 2005 03:00:00 +0000 | Diff: 3600 gmmktime(4,0,0,10,30,2005): 1130644800 | gmdate('r',1130644800):Sun, 30 Oct 2005 04:00:00 +0000 | Diff: 3600Crap! I posted a wrong version, where the dst parameter of the gmmktime call was set to 0 (which shouldn't make a difference according to the documenation by the way) To get the output a was talking about one has to remove the 7th parameter from the gmmktime call. ====================OUTPUT================= no dst --> dst gmmktime(1,0,0,3,27,2005): 1111885200 | gmdate('r',1111885200):Sun, 27 Mar 2005 01:00:00 +0000 gmmktime(2,0,0,3,27,2005): 1111892400 | gmdate('r',1111892400):Sun, 27 Mar 2005 03:00:00 +0000 | Diff: 7200 gmmktime(3,0,0,3,27,2005): 1111892400 | gmdate('r',1111892400):Sun, 27 Mar 2005 03:00:00 +0000 | Diff: 0 gmmktime(4,0,0,3,27,2005): 1111896000 | gmdate('r',1111896000):Sun, 27 Mar 2005 04:00:00 +0000 | Diff: 3600 dst --> no dst gmmktime(1,0,0,10,30,2005): 1130634000 | gmdate('r',1130634000):Sun, 30 Oct 2005 01:00:00 +0000 gmmktime(2,0,0,10,30,2005): 1130637600 | gmdate('r',1130637600):Sun, 30 Oct 2005 02:00:00 +0000 | Diff: 3600 gmmktime(3,0,0,10,30,2005): 1130641200 | gmdate('r',1130641200):Sun, 30 Oct 2005 03:00:00 +0000 | Diff: 3600 gmmktime(4,0,0,10,30,2005): 1130644800 | gmdate('r',1130644800):Sun, 30 Oct 2005 04:00:00 +0000 | Diff: 3600