1--TEST--
2RFC: DateTime and Daylight Saving Time Transitions (zone type 3)
3--CREDITS--
4Daniel Convissor <danielc@php.net>
5--XFAIL--
6RFC not implemented yet
7--FILE--
8<?php
9
10date_default_timezone_set('America/New_York');
11$date_format = 'Y-m-d H:i:s T e';
12$interval_format = 'P%dDT%hH';
13
14/*
15 * Forward Transitions, diff().
16 */
17
18$end   = new DateTime('2010-03-14 03:00:00');
19$start = new DateTime('2010-03-14 01:59:59');
20echo 'fd1 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
21	. ' = ' . $start->diff($end)->format('PT%hH%iM%sS') . "\n";
22
23$end   = new DateTime('2010-03-14 04:30:00');
24$start = new DateTime('2010-03-13 04:30:00');
25echo 'fd2 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
26	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
27
28$end   = new DateTime('2010-03-14 03:30:00');
29$start = new DateTime('2010-03-13 04:30:00');
30echo 'fd3 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
31	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
32
33$end   = new DateTime('2010-03-14 01:30:00');
34$start = new DateTime('2010-03-13 04:30:00');
35echo 'fd4 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
36	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
37
38$end   = new DateTime('2010-03-14 01:30:00');
39$start = new DateTime('2010-03-13 01:30:00');
40echo 'fd5 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
41	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
42
43$end   = new DateTime('2010-03-14 03:30:00');
44$start = new DateTime('2010-03-13 03:30:00');
45echo 'fd6 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
46	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
47
48$end   = new DateTime('2010-03-14 03:30:00');
49$start = new DateTime('2010-03-13 02:30:00');
50echo 'fd7 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
51	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
52
53echo "\n";
54
55/*
56 * Forward Transitions, add().
57 */
58
59$start = new DateTime('2010-03-14 01:59:59');
60$interval_spec = 'PT1S';
61$interval = new DateInterval($interval_spec);
62echo 'fa1 ' . $start->format($date_format) . " + $interval_spec = "
63	. $start->add($interval)->format($date_format) . "\n";
64
65$start = new DateTime('2010-03-13 04:30:00');
66$interval_spec = 'P1D';
67$interval = new DateInterval($interval_spec);
68echo 'fa2 ' . $start->format($date_format) . " + $interval_spec = "
69	. $start->add($interval)->format($date_format) . "\n";
70
71$start = new DateTime('2010-03-13 04:30:00');
72$interval_spec = 'PT22H';
73$interval = new DateInterval($interval_spec);
74echo 'fa3 ' . $start->format($date_format) . " + $interval_spec = "
75	. $start->add($interval)->format($date_format) . "\n";
76
77$start = new DateTime('2010-03-13 04:30:00');
78$interval_spec = 'PT21H';
79$interval = new DateInterval($interval_spec);
80echo 'fa4 ' . $start->format($date_format) . " + $interval_spec = "
81	. $start->add($interval)->format($date_format) . "\n";
82
83$start = new DateTime('2010-03-13 01:30:00');
84$interval_spec = 'P1D';
85$interval = new DateInterval($interval_spec);
86echo 'fa5 ' . $start->format($date_format) . " + $interval_spec = "
87	. $start->add($interval)->format($date_format) . "\n";
88
89$start = new DateTime('2010-03-13 02:30:00');
90$interval_spec = 'P1D';
91$interval = new DateInterval($interval_spec);
92echo 'fa6 ' . $start->format($date_format) . " + $interval_spec = "
93	. $start->add($interval)->format($date_format) . "\n";
94
95echo "\n";
96
97/*
98 * Forward Transitions, sub().
99 */
100
101$end   = new DateTime('2010-03-14 03:00:00');
102$interval_spec = 'PT1S';
103$interval = new DateInterval($interval_spec);
104echo 'fs1 ' . $end->format($date_format) . " - $interval_spec = "
105	. $end->sub($interval)->format($date_format) . "\n";
106
107$end   = new DateTime('2010-03-14 04:30:00');
108$interval_spec = 'P1D';
109$interval = new DateInterval($interval_spec);
110echo 'fs2 ' . $end->format($date_format) . " - $interval_spec = "
111	. $end->sub($interval)->format($date_format) . "\n";
112
113$end   = new DateTime('2010-03-14 03:30:00');
114$interval_spec = 'PT22H';
115$interval = new DateInterval($interval_spec);
116echo 'fs3 ' . $end->format($date_format) . " - $interval_spec = "
117	. $end->sub($interval)->format($date_format) . "\n";
118
119$end   = new DateTime('2010-03-14 01:30:00');
120$interval_spec = 'PT21H';
121$interval = new DateInterval($interval_spec);
122echo 'fs4 ' . $end->format($date_format) . " - $interval_spec = "
123	. $end->sub($interval)->format($date_format) . "\n";
124
125$end   = new DateTime('2010-03-14 01:30:00');
126$interval_spec = 'P1D';
127$interval = new DateInterval($interval_spec);
128echo 'fs5 ' . $end->format($date_format) . " - $interval_spec = "
129	. $end->sub($interval)->format($date_format) . "\n";
130
131$end   = new DateTime('2010-03-15 03:30:00');
132$interval_spec = 'P1D';
133$interval = new DateInterval($interval_spec);
134echo 'fs6 ' . $end->format($date_format) . " - $interval_spec = "
135	. $end->sub($interval)->format($date_format) . "\n";
136
137$end   = new DateTime('2010-03-15 02:30:00');
138$interval_spec = 'P1D';
139$interval = new DateInterval($interval_spec);
140echo 'fs7 ' . $end->format($date_format) . " - $interval_spec = "
141	. $end->sub($interval)->format($date_format) . "\n";
142
143echo "\n";
144
145
146/*
147 * For backward transitions, must create objects with zone type 2
148 * where specifying Daylight or Standard time is required
149 * then converting them to zone type 3.
150 */
151
152$tz = new DateTimeZone('America/New_York');
153
154/*
155 * Backward Transitions, diff().
156 */
157
158$end   = new DateTime('2010-11-07 01:00:00 EST');
159$end->setTimeZone($tz);
160$start = new DateTime('2010-11-07 01:59:59');
161echo 'bd1 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
162	. ' = ' . $start->diff($end)->format('PT%hH%iM%sS') . "\n";
163
164$end   = new DateTime('2010-11-07 04:30:00');
165$start = new DateTime('2010-11-06 04:30:00');
166echo 'bd2 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
167	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
168
169$end   = new DateTime('2010-11-07 03:30:00');
170$start = new DateTime('2010-11-06 04:30:00');
171echo 'bd3 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
172	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
173
174$end   = new DateTime('2010-11-07 02:30:00');
175$start = new DateTime('2010-11-06 04:30:00');
176echo 'bd4 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
177	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
178
179$end   = new DateTime('2010-11-07 01:30:00 EST');
180$end->setTimeZone($tz);
181$start = new DateTime('2010-11-06 04:30:00');
182echo 'bd5 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
183	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
184
185$end   = new DateTime('2010-11-07 01:30:00 EDT');
186$end->setTimeZone($tz);
187$start = new DateTime('2010-11-06 04:30:00');
188echo 'bd6 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
189	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
190
191$end   = new DateTime('2010-11-07 01:30:00');
192$start = new DateTime('2010-11-06 01:30:00');
193echo 'bd7 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
194	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
195
196$end   = new DateTime('2010-11-07 01:30:00 EST');
197$end->setTimeZone($tz);
198$start = new DateTime('2010-11-06 01:30:00');
199echo 'bd8 ' . $end->format($date_format) . ' - ' . $start->format($date_format)
200	. ' = ' . $start->diff($end)->format($interval_format) . "\n";
201
202echo "\n";
203
204/*
205 * Backward Transitions, add().
206 */
207
208$start = new DateTime('2010-11-07 01:59:59');
209$interval_spec = 'PT1S';
210$interval = new DateInterval($interval_spec);
211echo 'ba1 ' . $start->format($date_format) . " + $interval_spec = "
212	. $start->add($interval)->format($date_format) . "\n";
213
214$start = new DateTime('2010-11-06 04:30:00');
215$interval_spec = 'P1D';
216$interval = new DateInterval($interval_spec);
217echo 'ba2 ' . $start->format($date_format) . " + $interval_spec = "
218	. $start->add($interval)->format($date_format) . "\n";
219
220$start = new DateTime('2010-11-06 04:30:00');
221$interval_spec = 'PT24H';
222$interval = new DateInterval($interval_spec);
223echo 'ba3 ' . $start->format($date_format) . " + $interval_spec = "
224	. $start->add($interval)->format($date_format) . "\n";
225
226$start = new DateTime('2010-11-06 04:30:00');
227$interval_spec = 'PT23H';
228$interval = new DateInterval($interval_spec);
229echo 'ba4 ' . $start->format($date_format) . " + $interval_spec = "
230	. $start->add($interval)->format($date_format) . "\n";
231
232$start = new DateTime('2010-11-06 04:30:00');
233$interval_spec = 'PT22H';
234$interval = new DateInterval($interval_spec);
235echo 'ba5 ' . $start->format($date_format) . " + $interval_spec = "
236	. $start->add($interval)->format($date_format) . "\n";
237
238$start = new DateTime('2010-11-06 04:30:00');
239$interval_spec = 'PT21H';
240$interval = new DateInterval($interval_spec);
241echo 'ba6 ' . $start->format($date_format) . " + $interval_spec = "
242	. $start->add($interval)->format($date_format) . "\n";
243
244$start = new DateTime('2010-11-06 01:30:00');
245$interval_spec = 'P1D';
246$interval = new DateInterval($interval_spec);
247echo 'ba7 ' . $start->format($date_format) . " + $interval_spec = "
248	. $start->add($interval)->format($date_format) . "\n";
249
250$start = new DateTime('2010-11-06 01:30:00');
251$interval_spec = 'P1DT1H';
252$interval = new DateInterval($interval_spec);
253echo 'ba8 ' . $start->format($date_format) . " + $interval_spec = "
254	. $start->add($interval)->format($date_format) . "\n";
255
256$start = new DateTime('2010-11-06 04:30:00');
257$interval_spec = 'PT25H';
258$interval = new DateInterval($interval_spec);
259echo 'ba9 ' . $start->format($date_format) . " + $interval_spec = "
260	. $start->add($interval)->format($date_format) . "\n";
261
262$start = new DateTime('2010-11-06 03:30:00');
263$interval_spec = 'P1D';
264$interval = new DateInterval($interval_spec);
265echo 'ba10 ' . $start->format($date_format) . " + $interval_spec = "
266	. $start->add($interval)->format($date_format) . "\n";
267
268$start = new DateTime('2010-11-06 02:30:00');
269$interval_spec = 'P1D';
270$interval = new DateInterval($interval_spec);
271echo 'ba11 ' . $start->format($date_format) . " + $interval_spec = "
272	. $start->add($interval)->format($date_format) . "\n";
273
274echo "\n";
275
276/*
277 * Backward Transitions, sub().
278 */
279
280$end   = new DateTime('2010-11-07 01:00:00 EST');
281$end->setTimeZone($tz);
282$interval_spec = 'PT1S';
283$interval = new DateInterval($interval_spec);
284echo 'bs1 ' . $end->format($date_format) . " - $interval_spec = "
285	. $end->sub($interval)->format($date_format) . "\n";
286
287$end   = new DateTime('2010-11-07 04:30:00');
288$interval_spec = 'P1D';
289$interval = new DateInterval($interval_spec);
290echo 'bs2 ' . $end->format($date_format) . " - $interval_spec = "
291	. $end->sub($interval)->format($date_format) . "\n";
292
293$end   = new DateTime('2010-11-07 03:30:00');
294$interval_spec = 'PT24H';
295$interval = new DateInterval($interval_spec);
296echo 'bs3 ' . $end->format($date_format) . " - $interval_spec = "
297	. $end->sub($interval)->format($date_format) . "\n";
298
299$end   = new DateTime('2010-11-07 02:30:00');
300$interval_spec = 'PT23H';
301$interval = new DateInterval($interval_spec);
302echo 'bs4 ' . $end->format($date_format) . " - $interval_spec = "
303	. $end->sub($interval)->format($date_format) . "\n";
304
305$end   = new DateTime('2010-11-07 01:30:00 EST');
306$end->setTimeZone($tz);
307$interval_spec = 'PT22H';
308$interval = new DateInterval($interval_spec);
309echo 'bs5 ' . $end->format($date_format) . " - $interval_spec = "
310	. $end->sub($interval)->format($date_format) . "\n";
311
312$end   = new DateTime('2010-11-07 01:30:00 EDT');
313$end->setTimeZone($tz);
314$interval_spec = 'PT21H';
315$interval = new DateInterval($interval_spec);
316echo 'bs6 ' . $end->format($date_format) . " - $interval_spec = "
317	. $end->sub($interval)->format($date_format) . "\n";
318
319$end   = new DateTime('2010-11-07 01:30:00');
320$interval_spec = 'P1D';
321$interval = new DateInterval($interval_spec);
322echo 'bs7 ' . $end->format($date_format) . " - $interval_spec = "
323	. $end->sub($interval)->format($date_format) . "\n";
324
325$end   = new DateTime('2010-11-07 01:30:00 EST');
326$end->setTimeZone($tz);
327$interval_spec = 'P1DT1H';
328$interval = new DateInterval($interval_spec);
329echo 'bs8 ' . $end->format($date_format) . " - $interval_spec = "
330	. $end->sub($interval)->format($date_format) . "\n";
331
332$end   = new DateTime('2010-11-07 03:30:00');
333$interval_spec = 'P1D';
334$interval = new DateInterval($interval_spec);
335echo 'bs9 ' . $end->format($date_format) . " - $interval_spec = "
336	. $end->sub($interval)->format($date_format) . "\n";
337
338$end   = new DateTime('2010-11-07 02:30:00');
339$interval_spec = 'P1D';
340$interval = new DateInterval($interval_spec);
341echo 'bs10 ' . $end->format($date_format) . " - $interval_spec = "
342	. $end->sub($interval)->format($date_format) . "\n";
343
344?>
345--EXPECT--
346fd1 2010-03-14 03:00:00 EDT America/New_York - 2010-03-14 01:59:59 EST America/New_York = PT0H0M1S
347fd2 2010-03-14 04:30:00 EDT America/New_York - 2010-03-13 04:30:00 EST America/New_York = P1DT0H
348fd3 2010-03-14 03:30:00 EDT America/New_York - 2010-03-13 04:30:00 EST America/New_York = P0DT22H
349fd4 2010-03-14 01:30:00 EST America/New_York - 2010-03-13 04:30:00 EST America/New_York = P0DT21H
350fd5 2010-03-14 01:30:00 EST America/New_York - 2010-03-13 01:30:00 EST America/New_York = P1DT0H
351fd6 2010-03-14 03:30:00 EDT America/New_York - 2010-03-13 03:30:00 EST America/New_York = P1DT0H
352fd7 2010-03-14 03:30:00 EDT America/New_York - 2010-03-13 02:30:00 EST America/New_York = P1DT1H
353
354fa1 2010-03-14 01:59:59 EST America/New_York + PT1S = 2010-03-14 03:00:00 EDT America/New_York
355fa2 2010-03-13 04:30:00 EST America/New_York + P1D = 2010-03-14 04:30:00 EDT America/New_York
356fa3 2010-03-13 04:30:00 EST America/New_York + PT22H = 2010-03-14 03:30:00 EDT America/New_York
357fa4 2010-03-13 04:30:00 EST America/New_York + PT21H = 2010-03-14 01:30:00 EST America/New_York
358fa5 2010-03-13 01:30:00 EST America/New_York + P1D = 2010-03-14 01:30:00 EST America/New_York
359fa6 2010-03-13 02:30:00 EST America/New_York + P1D = 2010-03-14 03:30:00 EDT America/New_York
360
361fs1 2010-03-14 03:00:00 EDT America/New_York - PT1S = 2010-03-14 01:59:59 EST America/New_York
362fs2 2010-03-14 04:30:00 EDT America/New_York - P1D = 2010-03-13 04:30:00 EST America/New_York
363fs3 2010-03-14 03:30:00 EDT America/New_York - PT22H = 2010-03-13 04:30:00 EST America/New_York
364fs4 2010-03-14 01:30:00 EST America/New_York - PT21H = 2010-03-13 04:30:00 EST America/New_York
365fs5 2010-03-14 01:30:00 EST America/New_York - P1D = 2010-03-13 01:30:00 EST America/New_York
366fs6 2010-03-15 03:30:00 EDT America/New_York - P1D = 2010-03-14 03:30:00 EDT America/New_York
367fs7 2010-03-15 03:30:00 EDT America/New_York - P1D = 2010-03-14 03:30:00 EDT America/New_York
368
369bd1 2010-11-07 01:00:00 EST America/New_York - 2010-11-07 01:59:59 EDT America/New_York = PT0H0M1S
370bd2 2010-11-07 04:30:00 EST America/New_York - 2010-11-06 04:30:00 EDT America/New_York = P1DT0H
371bd3 2010-11-07 03:30:00 EST America/New_York - 2010-11-06 04:30:00 EDT America/New_York = P0DT24H
372bd4 2010-11-07 02:30:00 EST America/New_York - 2010-11-06 04:30:00 EDT America/New_York = P0DT23H
373bd5 2010-11-07 01:30:00 EST America/New_York - 2010-11-06 04:30:00 EDT America/New_York = P0DT22H
374bd6 2010-11-07 01:30:00 EDT America/New_York - 2010-11-06 04:30:00 EDT America/New_York = P0DT21H
375bd7 2010-11-07 01:30:00 EDT America/New_York - 2010-11-06 01:30:00 EDT America/New_York = P1DT0H
376bd8 2010-11-07 01:30:00 EST America/New_York - 2010-11-06 01:30:00 EDT America/New_York = P1DT1H
377
378ba1 2010-11-07 01:59:59 EDT America/New_York + PT1S = 2010-11-07 01:00:00 EST America/New_York
379ba2 2010-11-06 04:30:00 EDT America/New_York + P1D = 2010-11-07 04:30:00 EST America/New_York
380ba3 2010-11-06 04:30:00 EDT America/New_York + PT24H = 2010-11-07 03:30:00 EST America/New_York
381ba4 2010-11-06 04:30:00 EDT America/New_York + PT23H = 2010-11-07 02:30:00 EST America/New_York
382ba5 2010-11-06 04:30:00 EDT America/New_York + PT22H = 2010-11-07 01:30:00 EST America/New_York
383ba6 2010-11-06 04:30:00 EDT America/New_York + PT21H = 2010-11-07 01:30:00 EDT America/New_York
384ba7 2010-11-06 01:30:00 EDT America/New_York + P1D = 2010-11-07 01:30:00 EDT America/New_York
385ba8 2010-11-06 01:30:00 EDT America/New_York + P1DT1H = 2010-11-07 01:30:00 EST America/New_York
386ba9 2010-11-06 04:30:00 EDT America/New_York + PT25H = 2010-11-07 04:30:00 EST America/New_York
387ba10 2010-11-06 03:30:00 EDT America/New_York + P1D = 2010-11-07 03:30:00 EST America/New_York
388ba11 2010-11-06 02:30:00 EDT America/New_York + P1D = 2010-11-07 02:30:00 EST America/New_York
389
390bs1 2010-11-07 01:00:00 EST America/New_York - PT1S = 2010-11-07 01:59:59 EDT America/New_York
391bs2 2010-11-07 04:30:00 EST America/New_York - P1D = 2010-11-06 04:30:00 EDT America/New_York
392bs3 2010-11-07 03:30:00 EST America/New_York - PT24H = 2010-11-06 04:30:00 EDT America/New_York
393bs4 2010-11-07 02:30:00 EST America/New_York - PT23H = 2010-11-06 04:30:00 EDT America/New_York
394bs5 2010-11-07 01:30:00 EST America/New_York - PT22H = 2010-11-06 04:30:00 EDT America/New_York
395bs6 2010-11-07 01:30:00 EDT America/New_York - PT21H = 2010-11-06 04:30:00 EDT America/New_York
396bs7 2010-11-07 01:30:00 EDT America/New_York - P1D = 2010-11-06 01:30:00 EDT America/New_York
397bs8 2010-11-07 01:30:00 EST America/New_York - P1DT1H = 2010-11-06 00:30:00 EDT America/New_York
398bs9 2010-11-07 03:30:00 EST America/New_York - P1D = 2010-11-06 03:30:00 EDT America/New_York
399bs10 2010-11-07 02:30:00 EST America/New_York - P1D = 2010-11-06 02:30:00 EDT America/New_York
400