Skip to content

Commit 582f6e5

Browse files
committed
Fixed a few DST changeover issues.
1 parent 5d0c526 commit 582f6e5

5 files changed

+24
-3
lines changed

ext/date/lib/interval.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,14 @@ timelib_time *timelib_add(timelib_time *old_time, timelib_rel_time *interval)
111111
t->sse_uptodate = 0;
112112

113113
timelib_update_ts(t, NULL);
114+
115+
// printf("%lld %lld %d\n", old_time->dst, t->dst, (t->sse - old_time->sse));
116+
/* Adjust for backwards DST changeover */
117+
if (old_time->dst == 1 && t->dst == 0 && !interval->y && !interval->m && !interval->d) {
118+
t->sse -= old_time->z;
119+
t->sse += t->z;
120+
}
121+
114122
timelib_update_from_sse(t);
115123
t->have_relative = 0;
116124

@@ -137,6 +145,18 @@ timelib_time *timelib_sub(timelib_time *old_time, timelib_rel_time *interval)
137145
t->sse_uptodate = 0;
138146

139147
timelib_update_ts(t, NULL);
148+
149+
/* Adjust for backwards DST changeover */
150+
if (old_time->dst == 1 && t->dst == 0 && !interval->y && !interval->m && !interval->d) {
151+
t->sse -= old_time->z;
152+
t->sse += t->z;
153+
}
154+
/* Adjust for forwards DST changeover */
155+
if (old_time->dst == 0 && t->dst == 1 && !interval->y && !interval->m && !interval->d ) {
156+
t->sse -= old_time->z;
157+
t->sse += t->z;
158+
}
159+
140160
timelib_update_from_sse(t);
141161

142162
t->have_relative = 0;

ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-ba.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ ba4 2010-11-06 04:30:00 EDT America/New_York + PT23H = 2010-11-07 02:30:00 EST A
9090
ba5 2010-11-06 04:30:00 EDT America/New_York + PT22H = 2010-11-07 01:30:00 EST America/New_York
9191
ba6 2010-11-06 04:30:00 EDT America/New_York + PT21H = 2010-11-07 01:30:00 EDT America/New_York
9292
ba7 2010-11-06 01:30:00 EDT America/New_York + P1D = 2010-11-07 01:30:00 EDT America/New_York
93-
ba8 2010-11-06 01:30:00 EDT America/New_York + P1DT1H = 2010-11-07 01:30:00 EST America/New_York
93+
ba8 2010-11-06 01:30:00 EDT America/New_York + P1DT1H = 2010-11-07 02:30:00 EST America/New_York
9494
ba9 2010-11-06 04:30:00 EDT America/New_York + PT25H = 2010-11-07 04:30:00 EST America/New_York
9595
ba10 2010-11-06 03:30:00 EDT America/New_York + P1D = 2010-11-07 03:30:00 EST America/New_York
9696
ba11 2010-11-06 02:30:00 EDT America/New_York + P1D = 2010-11-07 02:30:00 EST America/New_York

ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bd2.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ $end = new DateTime('2010-11-07 05:30:00');
2525
$end->setTimeZone($tz);
2626
$start = new DateTime('2010-11-06 04:30:59');
2727
echo 'bd0 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
28-
. ' = ' . $start->diff($end)->format('PT%hH%iM%sS') . "\n";
28+
. ' = ' . $start->diff($end)->format('P%dDT%hH%iM%sS') . "\n";
2929

3030
$end = new DateTime('2010-11-07 01:30:00 EST');
3131
$end->setTimeZone($tz);

ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-bs.phpt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Daniel Convissor <danielc@php.net>
66
<?php
77

88
date_default_timezone_set('America/New_York');
9+
$tz = new DateTimeZone('America/New_York');
910
$date_format = 'Y-m-d H:i:s T e';
1011
$interval_format = 'P%dDT%hH';
1112

ext/date/tests/rfc-datetime_and_daylight_saving_time-type3-fs.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,4 @@ fs3 2010-03-14 03:30:00 EDT America/New_York - PT22H = 2010-03-13 04:30:00 EST A
6262
fs4 2010-03-14 01:30:00 EST America/New_York - PT21H = 2010-03-13 04:30:00 EST America/New_York
6363
fs5 2010-03-14 01:30:00 EST America/New_York - P1D = 2010-03-13 01:30:00 EST America/New_York
6464
fs6 2010-03-15 03:30:00 EDT America/New_York - P1D = 2010-03-14 03:30:00 EDT America/New_York
65-
fs7 2010-03-15 03:30:00 EDT America/New_York - P1D = 2010-03-14 03:30:00 EDT America/New_York
65+
fs7 2010-03-15 02:30:00 EDT America/New_York - P1D = 2010-03-14 03:30:00 EDT America/New_York

0 commit comments

Comments
 (0)