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