summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerick Rethans <github@derickrethans.nl>2013-06-20 09:28:23 +0100
committerDerick Rethans <github@derickrethans.nl>2013-11-28 12:02:36 +0000
commit582f6e529e843b412d582023bf0270e47b1aa468 (patch)
treea48612f1454a50233fcdee1d79aeccc18f95344c
parent5d0c526199add0e4f054a57db29d882c8ad89a23 (diff)
downloadphp-git-582f6e529e843b412d582023bf0270e47b1aa468.tar.gz
Fixed a few DST changeover issues.
-rw-r--r--ext/date/lib/interval.c20
-rw-r--r--ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-ba.phpt2
-rw-r--r--ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bd2.phpt2
-rw-r--r--ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bs.phpt1
-rw-r--r--ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-fs.phpt2
5 files changed, 24 insertions, 3 deletions
diff --git a/ext/date/lib/interval.c b/ext/date/lib/interval.c
index 7fa1fc5c13..dce62f3a28 100644
--- a/ext/date/lib/interval.c
+++ b/ext/date/lib/interval.c
@@ -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;
diff --git a/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-ba.phpt b/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-ba.phpt
index 45db229b46..fdbe96d7d0 100644
--- a/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-ba.phpt
+++ b/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-ba.phpt
@@ -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
diff --git a/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bd2.phpt b/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bd2.phpt
index c2fe4bf6f1..62dab5d93f 100644
--- a/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bd2.phpt
+++ b/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bd2.phpt
@@ -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);
diff --git a/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bs.phpt b/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bs.phpt
index 0dd384aa93..138c68f3a9 100644
--- a/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bs.phpt
+++ b/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bs.phpt
@@ -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';
diff --git a/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-fs.phpt b/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-fs.phpt
index 4b3c2542ca..f8066ae71d 100644
--- a/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-fs.phpt
+++ b/ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-fs.phpt
@@ -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