|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2004-03-08 21:27 UTC] scottmacvicar at ntlworld dot com
Description:
------------
This bug seems to have different affect on Windows and Linux.
Windows
------
System has to be running GMT and Automatically adjust clock for daylight savings time checked.
You'll notice that the 27th appears twice. The second occurence of the 27th is Sat Mar 27 23:00:00 2004.
------
Redhat 9.0
------
The timestamp for linux on the 28th is Sun Mar 28 02:00:00 2004
/etc/sysconfig/clock
ZONE="Europe/London"
UTC=true
ARC=false
------
So Windows lost an hour and linux gained 2 hours.
Patch
--- datetime.c 2004-03-09 02:19:32.000000000 +0000
+++ datetime.c.patched 2004-03-09 02:20:48.000000000 +0000
@@ -192,8 +192,8 @@
/* fall-through */
case 1: /* hour */
val = (*arguments[0])->value.lval;
- if (val < 1) {
- chgsecs += (1-val) * 60*60; val = 1;
+ if (val < 2) {
+ chgsecs += (2-val) * 60*60; val = 2;
}
ta->tm_hour = val;
/* fall-through */
Changing the time to
02:01:01 seems to correct this issue and the windows machine stops eating an hour and not setting tm_idst to 1 and i have no idea whats going on with the linux machine.
Reproduce code:
---------------
<?php
for ($i = 26; $i <= 29; $i++)
{
$datestamp = gmmktime(0, 0, 0, 3, $i, 2004);
$day = gmdate('j', $datestamp);
echo "$datestamp - $day\n\n";
}
?>
Expected result:
----------------
1080259200 - 26
1080345600 - 27
1080432000 - 28
1080518400 - 29
Actual result:
--------------
Windows
---
1080259200 - 26
1080345600 - 27
1080428400 - 27
1080518400 - 29
Linux
---
1080259200 - 26
1080345600 - 27
1080439200 - 28
1080518400 - 29
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 03 09:00:02 2025 UTC |
The patch doesn't seem to have solved the problem. Or perhaps it's introduced a new one? Here's a simnple test case that calculates the GMT timestamp using gmmktime, then echos it back using gmstrftime, which should return the SAME time: for ($day = 2 ; $day <= 6 ; $day++) { $datestamp = gmmktime(1,15,0,4,$day,2004); print gmstrftime("%Y-%m-%d %H:%M",$datestamp) . "\n"; } Expected Result: 2004-04-02 01:15 2004-04-03 01:15 2004-04-04 01:15 2004-04-05 01:15 2004-04-06 01:15 Actual Result: 2004-04-02 01:15 2004-04-03 01:15 2004-04-04 03:15 2004-04-05 01:15 2004-04-06 01:15 This only occurs when the datestamp is between 1:00 a.m. and 1:59 a.m. GMT on the day where DST takes effect.I did some testing on a few machines I have here are the results Broken: #1 libc-2.3.2.so Linux version 2.4.22-28mdk (qateam@updates.mandrakesoft.com) (gcc version 3.3.1 (Mandrake Linux 9.2 3.3.1-2mdk)) #1 Thu Feb 19 22:28:14 MST 2004 PHP 5.0.0RC1 (cli) #2 libc-2.3.2.so Linux version 2.4.22 (root@(none)) (gcc version 3.3) #2 SMP Tue Feb 10 02:15:52 MST 2004 PHP 5.0.0RC1 (cli) Works: #1 libc-2.3.2.so Linux version 2.4.22-28mdk (qateam@updates.mandrakesoft.com) (gcc version 3.3.1 (Mandrake Linux 9.2 3.3.1-2mdk)) #1 Thu Feb 19 22:28:14 MST 2004 PHP 4.3.4 (cli) #2 libc-2.2.4.so Linux version 2.4.23 (root@(none)) (gcc version 2.95.3 20010315 (release)) #4 SMP Mon Dec 15 08:37:53 MST 2003 PHP 4.0.6 I hope this helps Also of notem I have noticed that <?php $date1 = mktime( 0, 0, 0, 4, 1, 2001 ); $date2 = mktime( 0, 0, 0, 4, 1, 2001 ) - 1; print date("Y-m-d H:i:s",$date1)."\n"; print date("Y-m-d H:i:s",$date2)."\n"; ?> should produce: 2001-04-01 00:00:00 2001-03-31 23:59:59 But I get: 2001-04-01 01:00:00 2001-04-01 00:59:59 With the same sucess and failure as the above example