]> granicus.if.org Git - php/commitdiff
Fixed a few DST changeover issues.
authorDerick Rethans <github@derickrethans.nl>
Thu, 20 Jun 2013 08:28:23 +0000 (09:28 +0100)
committerDerick Rethans <github@derickrethans.nl>
Thu, 28 Nov 2013 12:02:36 +0000 (12:02 +0000)
ext/date/lib/interval.c
ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-ba.phpt
ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bd2.phpt
ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bs.phpt
ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-fs.phpt

index 7fa1fc5c13f24c05ddae53b9fa952bca344ff318..dce62f3a2803db69af026105f8c862806c512bcf 100644 (file)
@@ -111,6 +111,14 @@ timelib_time *timelib_add(timelib_time *old_time, timelib_rel_time *interval)
        t->sse_uptodate = 0;
 
        timelib_update_ts(t, NULL);
+
+//     printf("%lld %lld %d\n", old_time->dst, t->dst, (t->sse - old_time->sse));
+       /* Adjust for backwards DST changeover */
+       if (old_time->dst == 1 && t->dst == 0 && !interval->y && !interval->m && !interval->d) {
+               t->sse -= old_time->z;
+               t->sse += t->z;
+       }
+
        timelib_update_from_sse(t);
        t->have_relative = 0;
 
@@ -137,6 +145,18 @@ timelib_time *timelib_sub(timelib_time *old_time, timelib_rel_time *interval)
        t->sse_uptodate = 0;
 
        timelib_update_ts(t, NULL);
+
+       /* Adjust for backwards DST changeover */
+       if (old_time->dst == 1 && t->dst == 0 && !interval->y && !interval->m && !interval->d) {
+               t->sse -= old_time->z;
+               t->sse += t->z;
+       }
+       /* Adjust for forwards DST changeover */
+       if (old_time->dst == 0 && t->dst == 1 && !interval->y && !interval->m && !interval->d ) {
+               t->sse -= old_time->z;
+               t->sse += t->z;
+       }
+
        timelib_update_from_sse(t);
 
        t->have_relative = 0;
index 45db229b46ebd46647f0da9f948a15f510e1e3ce..fdbe96d7d08cde470a946dd9b65e6bedfc0506aa 100644 (file)
@@ -90,7 +90,7 @@ ba4 2010-11-06 04:30:00 EDT America/New_York + PT23H = 2010-11-07 02:30:00 EST A
 ba5 2010-11-06 04:30:00 EDT America/New_York + PT22H = 2010-11-07 01:30:00 EST America/New_York
 ba6 2010-11-06 04:30:00 EDT America/New_York + PT21H = 2010-11-07 01:30:00 EDT America/New_York
 ba7 2010-11-06 01:30:00 EDT America/New_York + P1D = 2010-11-07 01:30:00 EDT America/New_York
-ba8 2010-11-06 01:30:00 EDT America/New_York + P1DT1H = 2010-11-07 01:30:00 EST America/New_York
+ba8 2010-11-06 01:30:00 EDT America/New_York + P1DT1H = 2010-11-07 02:30:00 EST America/New_York
 ba9 2010-11-06 04:30:00 EDT America/New_York + PT25H = 2010-11-07 04:30:00 EST America/New_York
 ba10 2010-11-06 03:30:00 EDT America/New_York + P1D = 2010-11-07 03:30:00 EST America/New_York
 ba11 2010-11-06 02:30:00 EDT America/New_York + P1D = 2010-11-07 02:30:00 EST America/New_York
index c2fe4bf6f1a1226b24c3355c1337285bf10d70b5..62dab5d93feda64db0ed474cf8b8ed157e249cdc 100644 (file)
@@ -25,7 +25,7 @@ $end   = new DateTime('2010-11-07 05:30:00');
 $end->setTimeZone($tz);
 $start = new DateTime('2010-11-06 04:30:59');
 echo 'bd0 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
-       . ' = ' . $start->diff($end)->format('PT%hH%iM%sS') . "\n";
+       . ' = ' . $start->diff($end)->format('P%dDT%hH%iM%sS') . "\n";
 
 $end   = new DateTime('2010-11-07 01:30:00 EST');
 $end->setTimeZone($tz);
index 0dd384aa93919cc16fe971e64e8f8327393b0437..138c68f3a9b4aa78b9defd195ff6a8753e7f84eb 100644 (file)
@@ -6,6 +6,7 @@ Daniel Convissor <danielc@php.net>
 <?php
 
 date_default_timezone_set('America/New_York');
+$tz = new DateTimeZone('America/New_York');
 $date_format = 'Y-m-d H:i:s T e';
 $interval_format = 'P%dDT%hH';
 
index 4b3c2542caf280365660dfb8e9f77f033732cd18..f8066ae71d0cded1c511b9f4c94d09ff5d19a2d1 100644 (file)
@@ -62,4 +62,4 @@ fs3 2010-03-14 03:30:00 EDT America/New_York - PT22H = 2010-03-13 04:30:00 EST A
 fs4 2010-03-14 01:30:00 EST America/New_York - PT21H = 2010-03-13 04:30:00 EST America/New_York
 fs5 2010-03-14 01:30:00 EST America/New_York - P1D = 2010-03-13 01:30:00 EST America/New_York
 fs6 2010-03-15 03:30:00 EDT America/New_York - P1D = 2010-03-14 03:30:00 EDT America/New_York
-fs7 2010-03-15 03:30:00 EDT America/New_York - P1D = 2010-03-14 03:30:00 EDT America/New_York
+fs7 2010-03-15 02:30:00 EDT America/New_York - P1D = 2010-03-14 03:30:00 EDT America/New_York