Skip to content

Commit 20d8c1b

Browse files
committed
Fixed bug #68549 (Timezones and offsets are not properly used when working with dates)
1 parent ee27762 commit 20d8c1b

File tree

3 files changed

+502
-0
lines changed

3 files changed

+502
-0
lines changed

ext/date/tests/DateTime_construct-dst-overlap.phpt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,24 @@ date_default_timezone_set('America/New_York');
1010
$d = new DateTime('2011-11-06 01:30:00');
1111
echo $d->format('P') . "\n";
1212

13+
date_default_timezone_set('Atlantic/Azores');
14+
// PHP defaults to Daylight Saving Time. Ensure consistency in future.
15+
$d = new DateTime('2011-10-30 00:30:00');
16+
echo $d->format('P') . "\n";
17+
18+
date_default_timezone_set('Europe/London');
19+
// PHP defaults to normal time. Ensure consistency in future.
20+
$d = new DateTime('2011-10-30 01:30:00');
21+
echo $d->format('P') . "\n";
22+
23+
date_default_timezone_set('Europe/Amsterdam');
24+
// PHP defaults to normal time. Ensure consistency in future.
25+
$d = new DateTime('2011-10-30 02:30:00');
26+
echo $d->format('P') . "\n";
27+
1328
?>
1429
--EXPECT--
1530
-04:00
31+
+00:00
32+
+00:00
33+
+01:00
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
--TEST--
2+
Bug #68549 (setting timestamp around a DST transition)
3+
--CREDITS--
4+
Roel Harbers <roel.harbers@on2it.net>
5+
--FILE--
6+
<?php
7+
$timezonesWithTimestamps = [
8+
'America/Los_Angeles' => [
9+
// LANG=en_US TZ="America/Los_Angeles" date --date=@<...>
10+
// forward:
11+
1615687199, // Sat Mar 13 17:59:59 PST 2021 (Sun Mar 14 01:59:59 UTC 2021)
12+
1615687200, // Sat Mar 13 18:00:00 PST 2021 (Sun Mar 14 02:00:00 UTC 2021)
13+
1615687201, // Sat Mar 13 18:00:01 PST 2021 (Sun Mar 14 02:00:01 UTC 2021)
14+
1615690799, // Sat Mar 13 18:59:59 PST 2021 (Sun Mar 14 02:59:59 UTC 2021)
15+
1615690800, // Sat Mar 13 19:00:00 PST 2021 (Sun Mar 14 03:00:00 UTC 2021)
16+
1615690801, // Sat Mar 13 19:00:01 PST 2021 (Sun Mar 14 03:00:01 UTC 2021)
17+
1615708799, // Sun Mar 13 23:59:59 PST 2021
18+
1615708800, // Sun Mar 14 00:00:00 PST 2021
19+
1615708801, // Sun Mar 14 00:00:01 PST 2021
20+
1615712399, // Sun Mar 14 00:59:59 PST 2021
21+
1615712400, // Sun Mar 14 01:00:00 PST 2021
22+
1615712401, // Sun Mar 14 01:00:01 PST 2021
23+
1615715999, // Sun Mar 14 01:59:59 PST 2021
24+
1615716000, // Sun Mar 14 03:00:00 PDT 2021
25+
1615716001, // Sun Mar 14 03:00:01 PDT 2021
26+
1615719599, // Sun Mar 14 03:59:59 PDT 2021
27+
1615719600, // Sun Mar 14 04:00:00 PDT 2021
28+
1615719601, // Sun Mar 14 04:00:01 PDT 2021
29+
// backward:
30+
1636246799, // Sat Nov 6 17:59:59 PDT 2021 (Sun Nov 7 00:59:59 UTC 2021)
31+
1636246800, // Sat Nov 6 18:00:00 PDT 2021 (Sun Nov 7 01:00:00 UTC 2021)
32+
1636246801, // Sat Nov 6 18:00:01 PDT 2021 (Sun Nov 7 01:00:01 UTC 2021)
33+
1636250399, // Sat Nov 6 18:59:59 PDT 2021 (Sun Nov 7 01:59:59 UTC 2021)
34+
1636250400, // Sat Nov 6 19:00:00 PDT 2021 (Sun Nov 7 02:00:00 UTC 2021)
35+
1636250401, // Sat Nov 6 19:00:01 PDT 2021 (Sun Nov 7 02:00:01 UTC 2021)
36+
1636268399, // Sat Nov 6 23:59:59 PDT 2021
37+
1636268400, // Sun Nov 7 00:00:00 PDT 2021
38+
1636268401, // Sun Nov 7 00:00:01 PDT 2021
39+
1636271999, // Sun Nov 7 00:59:59 PDT 2021
40+
1636272000, // Sun Nov 7 01:00:00 PDT 2021
41+
1636272001, // Sun Nov 7 01:00:01 PDT 2021
42+
1636275599, // Sun Nov 7 01:59:59 PDT 2021
43+
1636275600, // Sun Nov 7 01:00:00 PST 2021
44+
1636275601, // Sun Nov 7 01:00:01 PST 2021
45+
1636279199, // Sun Nov 7 01:59:59 PST 2021
46+
1636279200, // Sun Nov 7 02:00:00 PST 2021
47+
1636279201, // Sun Nov 7 02:00:01 PST 2021
48+
],
49+
'Atlantic/Azores' => [
50+
// LANG=en_US TZ="Atlantic/Azores" date --date=@<...>
51+
// forward:
52+
1616889599, // Sat Mar 27 22:59:59 AZOT 2021 (Sat Mar 27 23:59:59 UTC 2021)
53+
1616889600, // Sat Mar 27 23:00:00 AZOT 2021 (Sun Mar 28 00:00:00 UTC 2021)
54+
1616889601, // Sat Mar 27 23:00:01 AZOT 2021 (Sun Mar 28 00:00:01 UTC 2021)
55+
1616893199, // Sat Mar 27 23:59:59 AZOT 2021 (Sun Mar 28 00:59:59 UTC 2021)
56+
1616893200, // Sun Mar 28 01:00:00 AZOST 2021 (Sun Mar 28 01:00:00 UTC 2021)
57+
1616893201, // Sun Mar 28 01:00:01 AZOST 2021 (Sun Mar 28 01:00:01 UTC 2021)
58+
1616896799, // Sun Mar 28 01:59:59 AZOST 2021
59+
1616896800, // Sun Mar 28 02:00:00 AZOST 2021
60+
1616896801, // Sun Mar 28 02:00:01 AZOST 2021
61+
// backward:
62+
1635638399, // Sat Oct 30 23:59:59 AZOST 2021 (Sat Oct 30 23:59:59 UTC 2021)
63+
1635638400, // Sun Oct 31 00:00:00 AZOST 2021 (Sun Oct 31 00:00:00 UTC 2021)
64+
1635638401, // Sun Oct 31 00:00:01 AZOST 2021 (Sun Oct 31 00:00:01 UTC 2021)
65+
1635641999, // Sun Oct 31 00:59:59 AZOST 2021 (Sun Oct 31 00:59:59 UTC 2021)
66+
1635642000, // Sun Oct 31 00:00:00 AZOT 2021 (Sun Oct 31 01:00:00 UTC 2021)
67+
1635642001, // Sun Oct 31 00:00:01 AZOT 2021 (Sun Oct 31 01:00:01 UTC 2021)
68+
1635645599, // Sun Oct 31 00:59:59 AZOT 2021
69+
1635645600, // Sun Oct 31 01:00:00 AZOT 2021
70+
1635645601, // Sun Oct 31 01:00:01 AZOT 2021
71+
],
72+
'Europe/London' => [
73+
// LANG=en_US TZ="Europe/London" date --date=@<...>
74+
// forward:
75+
1616889599, // Sat Mar 27 23:59:59 GMT 2021
76+
1616889600, // Sun Mar 28 00:00:00 GMT 2021
77+
1616889601, // Sun Mar 28 00:00:01 GMT 2021
78+
1616893199, // Sun Mar 28 00:59:59 GMT 2021 (Sun Mar 28 00:59:59 UTC 2021)
79+
1616893200, // Sun Mar 28 02:00:00 BST 2021 (Sun Mar 28 01:00:00 UTC 2021)
80+
1616893201, // Sun Mar 28 02:00:01 BST 2021 (Sun Mar 28 01:00:01 UTC 2021)
81+
1616896799, // Sun Mar 28 02:59:59 BST 2021 (Sun Mar 28 01:59:59 UTC 2021)
82+
1616896800, // Sun Mar 28 03:00:00 BST 2021 (Sun Mar 28 02:00:00 UTC 2021)
83+
1616896801, // Sun Mar 28 03:00:01 BST 2021 (Sun Mar 28 02:00:01 UTC 2021)
84+
// backward:
85+
1635638399, // Sun Oct 31 00:59:59 BST 2021
86+
1635638400, // Sun Oct 31 01:00:00 BST 2021
87+
1635638401, // Sun Oct 31 01:00:01 BST 2021
88+
1635641999, // Sun Oct 31 01:59:59 BST 2021 (Sun Oct 31 00:59:59 UTC 2021)
89+
1635642000, // Sun Oct 31 01:00:00 GMT 2021 (Sun Oct 31 01:00:00 UTC 2021)
90+
1635642001, // Sun Oct 31 01:00:01 GMT 2021 (Sun Oct 31 01:00:01 UTC 2021)
91+
1635645599, // Sun Oct 31 01:59:59 GMT 2021 (Sun Oct 31 01:59:59 UTC 2021)
92+
1635645600, // Sun Oct 31 02:00:00 GMT 2021 (Sun Oct 31 02:00:00 UTC 2021)
93+
1635645601, // Sun Oct 31 02:00:01 GMT 2021 (Sun Oct 31 02:00:01 UTC 2021)
94+
],
95+
'Europe/Amsterdam' => [
96+
// LANG=en_US TZ="Europe/Amsterdam" date --date=@<...>
97+
// forward:
98+
1616885999, // Sat Mar 27 23:59:59 CET 2021
99+
1616886000, // Sun Mar 28 00:00:00 CET 2021
100+
1616886001, // Sun Mar 28 00:00:01 CET 2021
101+
1616889599, // Sun Mar 28 00:59:59 CET 2021
102+
1616889600, // Sun Mar 28 01:00:00 CET 2021
103+
1616889601, // Sun Mar 28 01:00:01 CET 2021
104+
1616893199, // Sun Mar 28 01:59:59 CET 2021
105+
1616893200, // Sun Mar 28 03:00:00 CEST 2021
106+
1616893201, // Sun Mar 28 03:00:01 CEST 2021
107+
1616896799, // Sun Mar 28 03:59:59 CEST 2021 (Sun Mar 28 01:59:59 UTC 2021)
108+
1616896800, // Sun Mar 28 04:00:00 CEST 2021 (Sun Mar 28 02:00:00 UTC 2021)
109+
1616896801, // Sun Mar 28 04:00:01 CEST 2021 (Sun Mar 28 02:00:01 UTC 2021)
110+
1616900399, // Sun Mar 28 04:59:59 CEST 2021 (Sun Mar 28 02:59:59 UTC 2021)
111+
1616900400, // Sun Mar 28 05:00:00 CEST 2021 (Sun Mar 28 03:00:00 UTC 2021)
112+
1616900401, // Sun Mar 28 05:00:01 CEST 2021 (Sun Mar 28 03:00:01 UTC 2021)
113+
// backward:
114+
1635631199, // Sat Oct 30 23:59:59 CEST 2021
115+
1635631200, // Sun Oct 31 00:00:00 CEST 2021
116+
1635631201, // Sun Oct 31 00:00:01 CEST 2021
117+
1635638399, // Sun Oct 31 01:59:59 CEST 2021
118+
1635638400, // Sun Oct 31 02:00:00 CEST 2021
119+
1635638401, // Sun Oct 31 02:00:01 CEST 2021
120+
1635641999, // Sun Oct 31 02:59:59 CEST 2021
121+
1635642000, // Sun Oct 31 02:00:00 CET 2021
122+
1635642001, // Sun Oct 31 02:00:01 CET 2021
123+
1635645599, // Sun Oct 31 02:59:59 CET 2021 (Sun Oct 31 01:59:59 UTC 2021)
124+
1635645600, // Sun Oct 31 03:00:00 CET 2021 (Sun Oct 31 02:00:00 UTC 2021)
125+
1635645601, // Sun Oct 31 03:00:01 CET 2021 (Sun Oct 31 02:00:01 UTC 2021)
126+
1635649199, // Sun Oct 31 03:59:59 CET 2021 (Sun Oct 31 02:59:59 UTC 2021)
127+
1635649200, // Sun Oct 31 04:00:00 CET 2021 (Sun Oct 31 03:00:00 UTC 2021)
128+
1635649201, // Sun Oct 31 04:00:01 CET 2021 (Sun Oct 31 03:00:01 UTC 2021)
129+
],
130+
];
131+
foreach ($timezonesWithTimestamps as $timezone => $timestamps) {
132+
foreach ($timestamps as $timestamp) {
133+
$tz = new DateTimeZone($timezone);
134+
$dt = new DateTime('now', $tz);
135+
$dt->setTimestamp($timestamp);
136+
printf("%s %d -> %d %s\n", $timezone, $timestamp, $dt->getTimestamp(), $dt->format(DateTimeInterface::ISO8601));
137+
}
138+
}
139+
?>
140+
--EXPECT--
141+
America/Los_Angeles 1615687199 -> 1615687199 2021-03-13T17:59:59-0800
142+
America/Los_Angeles 1615687200 -> 1615687200 2021-03-13T18:00:00-0800
143+
America/Los_Angeles 1615687201 -> 1615687201 2021-03-13T18:00:01-0800
144+
America/Los_Angeles 1615690799 -> 1615690799 2021-03-13T18:59:59-0800
145+
America/Los_Angeles 1615690800 -> 1615690800 2021-03-13T19:00:00-0800
146+
America/Los_Angeles 1615690801 -> 1615690801 2021-03-13T19:00:01-0800
147+
America/Los_Angeles 1615708799 -> 1615708799 2021-03-13T23:59:59-0800
148+
America/Los_Angeles 1615708800 -> 1615708800 2021-03-14T00:00:00-0800
149+
America/Los_Angeles 1615708801 -> 1615708801 2021-03-14T00:00:01-0800
150+
America/Los_Angeles 1615712399 -> 1615712399 2021-03-14T00:59:59-0800
151+
America/Los_Angeles 1615712400 -> 1615712400 2021-03-14T01:00:00-0800
152+
America/Los_Angeles 1615712401 -> 1615712401 2021-03-14T01:00:01-0800
153+
America/Los_Angeles 1615715999 -> 1615715999 2021-03-14T01:59:59-0800
154+
America/Los_Angeles 1615716000 -> 1615716000 2021-03-14T03:00:00-0700
155+
America/Los_Angeles 1615716001 -> 1615716001 2021-03-14T03:00:01-0700
156+
America/Los_Angeles 1615719599 -> 1615719599 2021-03-14T03:59:59-0700
157+
America/Los_Angeles 1615719600 -> 1615719600 2021-03-14T04:00:00-0700
158+
America/Los_Angeles 1615719601 -> 1615719601 2021-03-14T04:00:01-0700
159+
America/Los_Angeles 1636246799 -> 1636246799 2021-11-06T17:59:59-0700
160+
America/Los_Angeles 1636246800 -> 1636246800 2021-11-06T18:00:00-0700
161+
America/Los_Angeles 1636246801 -> 1636246801 2021-11-06T18:00:01-0700
162+
America/Los_Angeles 1636250399 -> 1636250399 2021-11-06T18:59:59-0700
163+
America/Los_Angeles 1636250400 -> 1636250400 2021-11-06T19:00:00-0700
164+
America/Los_Angeles 1636250401 -> 1636250401 2021-11-06T19:00:01-0700
165+
America/Los_Angeles 1636268399 -> 1636268399 2021-11-06T23:59:59-0700
166+
America/Los_Angeles 1636268400 -> 1636268400 2021-11-07T00:00:00-0700
167+
America/Los_Angeles 1636268401 -> 1636268401 2021-11-07T00:00:01-0700
168+
America/Los_Angeles 1636271999 -> 1636271999 2021-11-07T00:59:59-0700
169+
America/Los_Angeles 1636272000 -> 1636272000 2021-11-07T01:00:00-0700
170+
America/Los_Angeles 1636272001 -> 1636272001 2021-11-07T01:00:01-0700
171+
America/Los_Angeles 1636275599 -> 1636275599 2021-11-07T01:59:59-0700
172+
America/Los_Angeles 1636275600 -> 1636275600 2021-11-07T01:00:00-0800
173+
America/Los_Angeles 1636275601 -> 1636275601 2021-11-07T01:00:01-0800
174+
America/Los_Angeles 1636279199 -> 1636279199 2021-11-07T01:59:59-0800
175+
America/Los_Angeles 1636279200 -> 1636279200 2021-11-07T02:00:00-0800
176+
America/Los_Angeles 1636279201 -> 1636279201 2021-11-07T02:00:01-0800
177+
Atlantic/Azores 1616889599 -> 1616889599 2021-03-27T22:59:59-0100
178+
Atlantic/Azores 1616889600 -> 1616889600 2021-03-27T23:00:00-0100
179+
Atlantic/Azores 1616889601 -> 1616889601 2021-03-27T23:00:01-0100
180+
Atlantic/Azores 1616893199 -> 1616893199 2021-03-27T23:59:59-0100
181+
Atlantic/Azores 1616893200 -> 1616893200 2021-03-28T01:00:00+0000
182+
Atlantic/Azores 1616893201 -> 1616893201 2021-03-28T01:00:01+0000
183+
Atlantic/Azores 1616896799 -> 1616896799 2021-03-28T01:59:59+0000
184+
Atlantic/Azores 1616896800 -> 1616896800 2021-03-28T02:00:00+0000
185+
Atlantic/Azores 1616896801 -> 1616896801 2021-03-28T02:00:01+0000
186+
Atlantic/Azores 1635638399 -> 1635638399 2021-10-30T23:59:59+0000
187+
Atlantic/Azores 1635638400 -> 1635638400 2021-10-31T00:00:00+0000
188+
Atlantic/Azores 1635638401 -> 1635638401 2021-10-31T00:00:01+0000
189+
Atlantic/Azores 1635641999 -> 1635641999 2021-10-31T00:59:59+0000
190+
Atlantic/Azores 1635642000 -> 1635642000 2021-10-31T00:00:00-0100
191+
Atlantic/Azores 1635642001 -> 1635642001 2021-10-31T00:00:01-0100
192+
Atlantic/Azores 1635645599 -> 1635645599 2021-10-31T00:59:59-0100
193+
Atlantic/Azores 1635645600 -> 1635645600 2021-10-31T01:00:00-0100
194+
Atlantic/Azores 1635645601 -> 1635645601 2021-10-31T01:00:01-0100
195+
Europe/London 1616889599 -> 1616889599 2021-03-27T23:59:59+0000
196+
Europe/London 1616889600 -> 1616889600 2021-03-28T00:00:00+0000
197+
Europe/London 1616889601 -> 1616889601 2021-03-28T00:00:01+0000
198+
Europe/London 1616893199 -> 1616893199 2021-03-28T00:59:59+0000
199+
Europe/London 1616893200 -> 1616893200 2021-03-28T02:00:00+0100
200+
Europe/London 1616893201 -> 1616893201 2021-03-28T02:00:01+0100
201+
Europe/London 1616896799 -> 1616896799 2021-03-28T02:59:59+0100
202+
Europe/London 1616896800 -> 1616896800 2021-03-28T03:00:00+0100
203+
Europe/London 1616896801 -> 1616896801 2021-03-28T03:00:01+0100
204+
Europe/London 1635638399 -> 1635638399 2021-10-31T00:59:59+0100
205+
Europe/London 1635638400 -> 1635638400 2021-10-31T01:00:00+0100
206+
Europe/London 1635638401 -> 1635638401 2021-10-31T01:00:01+0100
207+
Europe/London 1635641999 -> 1635641999 2021-10-31T01:59:59+0100
208+
Europe/London 1635642000 -> 1635642000 2021-10-31T01:00:00+0000
209+
Europe/London 1635642001 -> 1635642001 2021-10-31T01:00:01+0000
210+
Europe/London 1635645599 -> 1635645599 2021-10-31T01:59:59+0000
211+
Europe/London 1635645600 -> 1635645600 2021-10-31T02:00:00+0000
212+
Europe/London 1635645601 -> 1635645601 2021-10-31T02:00:01+0000
213+
Europe/Amsterdam 1616885999 -> 1616885999 2021-03-27T23:59:59+0100
214+
Europe/Amsterdam 1616886000 -> 1616886000 2021-03-28T00:00:00+0100
215+
Europe/Amsterdam 1616886001 -> 1616886001 2021-03-28T00:00:01+0100
216+
Europe/Amsterdam 1616889599 -> 1616889599 2021-03-28T00:59:59+0100
217+
Europe/Amsterdam 1616889600 -> 1616889600 2021-03-28T01:00:00+0100
218+
Europe/Amsterdam 1616889601 -> 1616889601 2021-03-28T01:00:01+0100
219+
Europe/Amsterdam 1616893199 -> 1616893199 2021-03-28T01:59:59+0100
220+
Europe/Amsterdam 1616893200 -> 1616893200 2021-03-28T03:00:00+0200
221+
Europe/Amsterdam 1616893201 -> 1616893201 2021-03-28T03:00:01+0200
222+
Europe/Amsterdam 1616896799 -> 1616896799 2021-03-28T03:59:59+0200
223+
Europe/Amsterdam 1616896800 -> 1616896800 2021-03-28T04:00:00+0200
224+
Europe/Amsterdam 1616896801 -> 1616896801 2021-03-28T04:00:01+0200
225+
Europe/Amsterdam 1616900399 -> 1616900399 2021-03-28T04:59:59+0200
226+
Europe/Amsterdam 1616900400 -> 1616900400 2021-03-28T05:00:00+0200
227+
Europe/Amsterdam 1616900401 -> 1616900401 2021-03-28T05:00:01+0200
228+
Europe/Amsterdam 1635631199 -> 1635631199 2021-10-30T23:59:59+0200
229+
Europe/Amsterdam 1635631200 -> 1635631200 2021-10-31T00:00:00+0200
230+
Europe/Amsterdam 1635631201 -> 1635631201 2021-10-31T00:00:01+0200
231+
Europe/Amsterdam 1635638399 -> 1635638399 2021-10-31T01:59:59+0200
232+
Europe/Amsterdam 1635638400 -> 1635638400 2021-10-31T02:00:00+0200
233+
Europe/Amsterdam 1635638401 -> 1635638401 2021-10-31T02:00:01+0200
234+
Europe/Amsterdam 1635641999 -> 1635641999 2021-10-31T02:59:59+0200
235+
Europe/Amsterdam 1635642000 -> 1635642000 2021-10-31T02:00:00+0100
236+
Europe/Amsterdam 1635642001 -> 1635642001 2021-10-31T02:00:01+0100
237+
Europe/Amsterdam 1635645599 -> 1635645599 2021-10-31T02:59:59+0100
238+
Europe/Amsterdam 1635645600 -> 1635645600 2021-10-31T03:00:00+0100
239+
Europe/Amsterdam 1635645601 -> 1635645601 2021-10-31T03:00:01+0100
240+
Europe/Amsterdam 1635649199 -> 1635649199 2021-10-31T03:59:59+0100
241+
Europe/Amsterdam 1635649200 -> 1635649200 2021-10-31T04:00:00+0100
242+
Europe/Amsterdam 1635649201 -> 1635649201 2021-10-31T04:00:01+0100

0 commit comments

Comments
 (0)