rasmus Sun Mar 28 10:03:56 2004 EDT
Modified files:
/php-src NEWS
/php-src/ext/standard datetime.c
/php-src/ext/standard/tests/time bug27719.phpt
Log:
MFB test case for bug #27719 and improve comments in this tricky DST code
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1662&r2=1.1663&ty=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.1662 php-src/NEWS:1.1663
--- php-src/NEWS:1.1662 Fri Mar 26 20:48:39 2004
+++ php-src/NEWS Sun Mar 28 10:03:56 2004
@@ -1,6 +1,7 @@
PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ????? 2004, PHP 5 Release Candidate 2
+- Fixed bug #27719 (mktime issues on and around DST changeover). (Rasmus)
- Changed sqlite to use studlyCaps convention for its OO API. (Marcus)
- Force destructors to have empty signatures. (Marcus)
- Stopped file uploads from throwing E_WARNINGs and E_NOTICEs which can not be
http://cvs.php.net/diff.php/php-src/ext/standard/datetime.c?r1=1.118&r2=1.119&ty=u
Index: php-src/ext/standard/datetime.c
diff -u php-src/ext/standard/datetime.c:1.118 php-src/ext/standard/datetime.c:1.119
--- php-src/ext/standard/datetime.c:1.118 Fri Mar 26 14:32:49 2004
+++ php-src/ext/standard/datetime.c Sun Mar 28 10:03:56 2004
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: datetime.c,v 1.118 2004/03/26 19:32:49 rasmus Exp $ */
+/* $Id: datetime.c,v 1.119 2004/03/28 15:03:56 rasmus Exp $ */
#include "php.h"
#include "zend_operators.h"
@@ -158,7 +158,7 @@
ta->tm_year = Z_LVAL_PP(arguments[5])
- ((Z_LVAL_PP(arguments[5]) > 1000) ? 1900 : 0);
/* fall-through */
- case 5: /* day in month (1-baesd) */
+ case 5: /* day in month (1-based) */
val = (*arguments[4])->value.lval;
if (val < 1) {
chgsecs += (1-val) * 60*60*24;
@@ -190,10 +190,10 @@
case 1: /* hour */
val = (*arguments[0])->value.lval;
/*
- We don't use 1 here to work around problems in some mktime
implementations
- when it comes to daylight savings time. Setting it to 4 and
working back from
- there with the chgsecs offset makes us immune to these problems.
- See http://bugs.php.net/27533 for more info.
+ We avoid midnight and a couple of hours after midnight here to work
around
+ various OS-level bugs in mktime and specifically daylight savings
time issues
+ in many mktime implementation.
+ See bugs #27533 and #27719 for more info.
*/
if (val < 4) {
chgsecs += (4-val) * 60*60; val = 4;
@@ -215,6 +215,11 @@
seconds = t - chgsecs;
+ /*
+ Here we check to see if the chgsecs fuzz factor we applied caused us to
+ move from dst to non-dst or vice-versa. If so we adjust accordingly to
+ avoid being off by an hour on the dst changeover date.
+ */
if (is_dst == -1) {
struct tm t1, t2;
t1 = *localtime(&t);
@@ -225,6 +230,11 @@
ta = localtime(&seconds);
}
+ /*
+ If the user didn't specify whether the timestamp passed in was dst
or not
+ then we fill it in based on the dst setting at the evaluated
timestamp
+ at the current TZ
+ */
is_dst = ta->tm_isdst;
}
http://cvs.php.net/diff.php/php-src/ext/standard/tests/time/bug27719.phpt?r1=1.1&r2=1.2&ty=u
Index: php-src/ext/standard/tests/time/bug27719.phpt
diff -u /dev/null php-src/ext/standard/tests/time/bug27719.phpt:1.2
--- /dev/null Sun Mar 28 10:03:56 2004
+++ php-src/ext/standard/tests/time/bug27719.phpt Sun Mar 28 10:03:56 2004
@@ -0,0 +1,65 @@
+--TEST--
+Bug #27719: mktime returns incorrect timestamp for dst days
+--FILE--
+<?php
+ putenv("TZ=EST"); // No DST
+ $a = mktime(0, 0, 0, 4, 4, 2004, 0);
+ $b = mktime(0, 0, 0, 4, 4, 2004, 1);
+ $c = mktime(0, 0, 0, 4, 4, 2004, -1);
+ echo "$a ".date("m/d/y h:i:s\n",$a);
+ echo "$b ".date("m/d/y h:i:s\n",$b);
+ echo "$c ".date("m/d/y h:i:s\n",$c);
+ echo "\n";
+ putenv("TZ=EST5DST"); // DST not in effect
+ $a = mktime(0, 0, 0, 2, 4, 2004, 0);
+ $b = mktime(0, 0, 0, 2, 4, 2004, 1);
+ $c = mktime(0, 0, 0, 2, 4, 2004, -1);
+ echo "$a ".date("m/d/y h:i:s\n",$a);
+ echo "$b ".date("m/d/y h:i:s\n",$b);
+ echo "$c ".date("m/d/y h:i:s\n",$c);
+ echo "\n";
+ putenv("TZ=EST5DST"); // Just before DST changeover
+ $a = mktime(0, 0, 0, 4, 4, 2004, 0);
+ $b = mktime(0, 0, 0, 4, 4, 2004, 1);
+ $c = mktime(0, 0, 0, 4, 4, 2004, -1);
+ echo "$a ".date("m/d/y h:i:s\n",$a);
+ echo "$b ".date("m/d/y h:i:s\n",$b);
+ echo "$c ".date("m/d/y h:i:s\n",$c);
+ echo "\n";
+ putenv("TZ=EST5DST"); // Just after DST changeover
+ $a = mktime(3, 0, 0, 4, 4, 2004, 0);
+ $b = mktime(3, 0, 0, 4, 4, 2004, 1);
+ $c = mktime(3, 0, 0, 4, 4, 2004, -1);
+ echo "$a ".date("m/d/y h:i:s\n",$a);
+ echo "$b ".date("m/d/y h:i:s\n",$b);
+ echo "$c ".date("m/d/y h:i:s\n",$c);
+ echo "\n";
+ putenv("TZ=EST5DST"); // DST in effect
+ $a = mktime(0, 0, 0, 6, 4, 2004, 0);
+ $b = mktime(0, 0, 0, 6, 4, 2004, 1);
+ $c = mktime(0, 0, 0, 6, 4, 2004, -1);
+ echo "$a ".date("m/d/y h:i:s\n",$a);
+ echo "$b ".date("m/d/y h:i:s\n",$b);
+ echo "$c ".date("m/d/y h:i:s\n",$c);
+ echo "\n";
+?>
+--EXPECT--
+1081054800 04/04/04 12:00:00
+1081054800 04/04/04 12:00:00
+1081054800 04/04/04 12:00:00
+
+1075870800 02/04/04 12:00:00
+1075867200 02/03/04 11:00:00
+1075870800 02/04/04 12:00:00
+
+1081054800 04/04/04 12:00:00
+1081051200 04/03/04 11:00:00
+1081054800 04/04/04 12:00:00
+
+1081065600 04/04/04 04:00:00
+1081062000 04/04/04 03:00:00
+1081062000 04/04/04 03:00:00
+
+1086325200 06/04/04 01:00:00
+1086321600 06/04/04 12:00:00
+1086321600 06/04/04 12:00:00
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php