]> granicus.if.org Git - php/commitdiff
Add extensive tests for DateTime::diff(), add() and sub().
authorDaniel Convissor <danielc@php.net>
Thu, 10 Feb 2011 22:57:41 +0000 (22:57 +0000)
committerDaniel Convissor <danielc@php.net>
Thu, 10 Feb 2011 22:57:41 +0000 (22:57 +0000)
13 files changed:
ext/date/tests/DateTime_diff_add_sub-absolute.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-dates.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-fall-type2-type2.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-fall-type2-type3.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-fall-type3-type2.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-fall-type3-type3.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-february.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-massive.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-spring-type2-type2.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-spring-type2-type3.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-spring-type3-type2.phpt [new file with mode: 0644]
ext/date/tests/DateTime_diff_add_sub-spring-type3-type3.phpt [new file with mode: 0644]
ext/date/tests/examine_diff.inc [new file with mode: 0644]

diff --git a/ext/date/tests/DateTime_diff_add_sub-absolute.phpt b/ext/date/tests/DateTime_diff_add_sub-absolute.phpt
new file mode 100644 (file)
index 0000000..25e5a7d
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+DateTime::diff() add() sub() -- absolute 
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Absolute
+ */
+echo "test_absolute_7: ";
+examine_diff('2009-01-14', '2009-01-07', 'P+0Y0M7DT0H0M0S', 7, true);
+
+echo "test_absolute_negative_7: ";
+examine_diff('2009-01-07', '2009-01-14', 'P+0Y0M7DT0H0M0S', 7, true);
+
+?>
+--EXPECT--
+test_absolute_7: FWD: 2009-01-14 00:00:00 EST - 2009-01-07 00:00:00 EST = **P+0Y0M7DT0H0M0S** | BACK: 2009-01-07 00:00:00 EST + P+0Y0M7DT0H0M0S = **2009-01-14 00:00:00 EST** | DAYS: **7**
+test_absolute_negative_7: FWD: 2009-01-07 00:00:00 EST - 2009-01-14 00:00:00 EST = **P+0Y0M7DT0H0M0S** | BACK: 2009-01-14 00:00:00 EST - P+0Y0M7DT0H0M0S = **2009-01-07 00:00:00 EST** | DAYS: **7**
diff --git a/ext/date/tests/DateTime_diff_add_sub-dates.phpt b/ext/date/tests/DateTime_diff_add_sub-dates.phpt
new file mode 100644 (file)
index 0000000..8fd7c40
--- /dev/null
@@ -0,0 +1,89 @@
+--TEST--
+DateTime::diff() add() sub() -- dates 
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Particular days
+ */
+echo "test__7: ";
+examine_diff('2009-01-14', '2009-01-07', 'P+0Y0M7DT0H0M0S', 7);
+
+echo "test_years_positive__7_by_0_day: ";
+examine_diff('2007-02-07', '2000-02-07', 'P+7Y0M0DT0H0M0S', 2557);
+
+echo "test_years_positive__7_by_1_day: ";
+examine_diff('2007-02-08', '2000-02-07', 'P+7Y0M1DT0H0M0S', 2558);
+
+echo "test_years_positive__6_shy_1_day: ";
+examine_diff('2007-02-06', '2000-02-07', 'P+6Y11M30DT0H0M0S', 2556);
+
+echo "test_years_positive__7_by_1_month: ";
+examine_diff('2007-03-07', '2000-02-07', 'P+7Y1M0DT0H0M0S', 2585);
+
+echo "test_years_positive__6_shy_1_month: ";
+examine_diff('2007-01-07', '2000-02-07', 'P+6Y11M0DT0H0M0S', 2526);
+
+echo "test_years_positive__7_by_1_month_split_newyear: ";
+examine_diff('2007-01-07', '1999-12-07', 'P+7Y1M0DT0H0M0S', 2588);
+
+echo "test_years_positive__6_shy_1_month_split_newyear: ";
+examine_diff('2006-12-07', '2000-01-07', 'P+6Y11M0DT0H0M0S', 2526);
+
+
+/*
+ * Particular days, negative
+ */
+echo "test_negative__7: ";
+examine_diff('2009-01-07', '2009-01-14', 'P-0Y0M7DT0H0M0S', 7);
+
+echo "test_years_negative__7_by_0_day: ";
+examine_diff('2000-02-07', '2007-02-07', 'P-7Y0M0DT0H0M0S', 2557);
+
+echo "test_years_negative__7_by_1_day: ";
+examine_diff('2000-02-07', '2007-02-08', 'P-7Y0M1DT0H0M0S', 2558);
+
+echo "test_years_negative__6_shy_1_day: ";
+examine_diff('2000-02-07', '2007-02-06', 'P-6Y11M28DT0H0M0S', 2556);
+
+echo "test_years_negative__7_by_1_month: ";
+examine_diff('2000-02-07', '2007-03-07', 'P-7Y1M0DT0H0M0S', 2585);
+
+echo "test_years_negative__6_shy_1_month: ";
+examine_diff('2000-02-07', '2007-01-07', 'P-6Y11M0DT0H0M0S', 2526);
+
+echo "test_years_negative__7_by_1_month_split_newyear: ";
+examine_diff('1999-12-07', '2007-01-07', 'P-7Y1M0DT0H0M0S', 2588);
+
+echo "test_years_negative__6_shy_1_month_split_newyear: ";
+examine_diff('2000-01-07', '2006-12-07', 'P-6Y11M0DT0H0M0S', 2526);
+
+?>
+--EXPECT--
+test__7: FWD: 2009-01-14 00:00:00 EST - 2009-01-07 00:00:00 EST = **P+0Y0M7DT0H0M0S** | BACK: 2009-01-07 00:00:00 EST + P+0Y0M7DT0H0M0S = **2009-01-14 00:00:00 EST** | DAYS: **7**
+test_years_positive__7_by_0_day: FWD: 2007-02-07 00:00:00 EST - 2000-02-07 00:00:00 EST = **P+7Y0M0DT0H0M0S** | BACK: 2000-02-07 00:00:00 EST + P+7Y0M0DT0H0M0S = **2007-02-07 00:00:00 EST** | DAYS: **2557**
+test_years_positive__7_by_1_day: FWD: 2007-02-08 00:00:00 EST - 2000-02-07 00:00:00 EST = **P+7Y0M1DT0H0M0S** | BACK: 2000-02-07 00:00:00 EST + P+7Y0M1DT0H0M0S = **2007-02-08 00:00:00 EST** | DAYS: **2558**
+test_years_positive__6_shy_1_day: FWD: 2007-02-06 00:00:00 EST - 2000-02-07 00:00:00 EST = **P+6Y11M30DT0H0M0S** | BACK: 2000-02-07 00:00:00 EST + P+6Y11M30DT0H0M0S = **2007-02-06 00:00:00 EST** | DAYS: **2556**
+test_years_positive__7_by_1_month: FWD: 2007-03-07 00:00:00 EST - 2000-02-07 00:00:00 EST = **P+7Y1M0DT0H0M0S** | BACK: 2000-02-07 00:00:00 EST + P+7Y1M0DT0H0M0S = **2007-03-07 00:00:00 EST** | DAYS: **2585**
+test_years_positive__6_shy_1_month: FWD: 2007-01-07 00:00:00 EST - 2000-02-07 00:00:00 EST = **P+6Y11M0DT0H0M0S** | BACK: 2000-02-07 00:00:00 EST + P+6Y11M0DT0H0M0S = **2007-01-07 00:00:00 EST** | DAYS: **2526**
+test_years_positive__7_by_1_month_split_newyear: FWD: 2007-01-07 00:00:00 EST - 1999-12-07 00:00:00 EST = **P+7Y1M0DT0H0M0S** | BACK: 1999-12-07 00:00:00 EST + P+7Y1M0DT0H0M0S = **2007-01-07 00:00:00 EST** | DAYS: **2588**
+test_years_positive__6_shy_1_month_split_newyear: FWD: 2006-12-07 00:00:00 EST - 2000-01-07 00:00:00 EST = **P+6Y11M0DT0H0M0S** | BACK: 2000-01-07 00:00:00 EST + P+6Y11M0DT0H0M0S = **2006-12-07 00:00:00 EST** | DAYS: **2526**
+test_negative__7: FWD: 2009-01-07 00:00:00 EST - 2009-01-14 00:00:00 EST = **P-0Y0M7DT0H0M0S** | BACK: 2009-01-14 00:00:00 EST + P-0Y0M7DT0H0M0S = **2009-01-07 00:00:00 EST** | DAYS: **7**
+test_years_negative__7_by_0_day: FWD: 2000-02-07 00:00:00 EST - 2007-02-07 00:00:00 EST = **P-7Y0M0DT0H0M0S** | BACK: 2007-02-07 00:00:00 EST + P-7Y0M0DT0H0M0S = **2000-02-07 00:00:00 EST** | DAYS: **2557**
+test_years_negative__7_by_1_day: FWD: 2000-02-07 00:00:00 EST - 2007-02-08 00:00:00 EST = **P-7Y0M1DT0H0M0S** | BACK: 2007-02-08 00:00:00 EST + P-7Y0M1DT0H0M0S = **2000-02-07 00:00:00 EST** | DAYS: **2558**
+test_years_negative__6_shy_1_day: FWD: 2000-02-07 00:00:00 EST - 2007-02-06 00:00:00 EST = **P-6Y11M28DT0H0M0S** | BACK: 2007-02-06 00:00:00 EST + P-6Y11M28DT0H0M0S = **2000-02-07 00:00:00 EST** | DAYS: **2556**
+test_years_negative__7_by_1_month: FWD: 2000-02-07 00:00:00 EST - 2007-03-07 00:00:00 EST = **P-7Y1M0DT0H0M0S** | BACK: 2007-03-07 00:00:00 EST + P-7Y1M0DT0H0M0S = **2000-02-07 00:00:00 EST** | DAYS: **2585**
+test_years_negative__6_shy_1_month: FWD: 2000-02-07 00:00:00 EST - 2007-01-07 00:00:00 EST = **P-6Y11M0DT0H0M0S** | BACK: 2007-01-07 00:00:00 EST + P-6Y11M0DT0H0M0S = **2000-02-07 00:00:00 EST** | DAYS: **2526**
+test_years_negative__7_by_1_month_split_newyear: FWD: 1999-12-07 00:00:00 EST - 2007-01-07 00:00:00 EST = **P-7Y1M0DT0H0M0S** | BACK: 2007-01-07 00:00:00 EST + P-7Y1M0DT0H0M0S = **1999-12-07 00:00:00 EST** | DAYS: **2588**
+test_years_negative__6_shy_1_month_split_newyear: FWD: 2000-01-07 00:00:00 EST - 2006-12-07 00:00:00 EST = **P-6Y11M0DT0H0M0S** | BACK: 2006-12-07 00:00:00 EST + P-6Y11M0DT0H0M0S = **2000-01-07 00:00:00 EST** | DAYS: **2526**
diff --git a/ext/date/tests/DateTime_diff_add_sub-fall-type2-type2.phpt b/ext/date/tests/DateTime_diff_add_sub-fall-type2-type2.phpt
new file mode 100644 (file)
index 0000000..8b165d8
--- /dev/null
@@ -0,0 +1,246 @@
+--TEST--
+DateTime::diff() add() sub() -- fall type2 type2
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--XFAIL--
+PHP < 5.4 has bugs
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Time, Fall, Zone Type 2 to Zone Type 2
+ *
+ * + prev: the day before the transition day  2010-11-06 18:38:28 EDT
+ * + dt: daylight time on transition day      2010-11-07 00:10:20 EDT
+ * + redodt: daylight time in the redo period 2010-11-07 01:12:33 EDT
+ * + redost: standard time in the redo period 2010-11-07 01:14:44 EST
+ * + st: standard time on the transition day  2010-11-07 03:16:55 EST
+ * + post: the day after the transition day   2010-11-08 19:59:59 EST
+ */
+echo "test_time_fall_type2_prev_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-10-04 02:18:48 EDT');  // sp prev, zt2
+examine_diff($end, $start, 'P+0Y1M2DT16H19M40S', 33);
+
+echo "test_time_fall_type2_prev_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+$start = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT5H31M52S', 0);
+
+echo "test_time_fall_type2_prev_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT6H34M5S', 0);
+
+echo "test_time_fall_type2_prev_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT7H36M16S', 0);
+
+echo "test_time_fall_type2_prev_type2_st: ";
+$end   = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+$start = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT9H38M27S', 0);
+
+echo "test_time_fall_type2_prev_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M2DT1H21M31S', 2);
+
+echo "test_time_fall_type2_dt_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P-0Y0M0DT5H31M52S', 0);
+
+echo "test_time_fall_type2_dt_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:15:35 EDT');  // sp dt, zt2
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT0H5M15S', 0);
+
+echo "test_time_fall_type2_dt_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT1H2M13S', 0);
+
+echo "test_time_fall_type2_dt_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT2H4M24S', 0);
+
+echo "test_time_fall_type2_dt_type2_st: ";
+$end   = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT4H6M35S', 0);
+
+echo "test_time_fall_type2_dt_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M1DT20H49M39S', 1);
+
+echo "test_time_fall_type2_redodt_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P-0Y0M0DT6H34M5S', 0);
+
+echo "test_time_fall_type2_redodt_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P-0Y0M0DT1H2M13S', 0);
+
+echo "test_time_fall_type2_redodt_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:15:35 EDT');  // sp redodt, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT0H3M2S', 0);
+
+echo "test_time_fall_type2_redodt_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT1H2M11S', 0);
+
+echo "test_time_fall_type2_redodt_type2_st: ";
+$end   = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT3H4M22S', 0);
+
+echo "test_time_fall_type2_redodt_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P+0Y0M1DT19H47M26S', 1);
+
+echo "test_time_fall_type2_redost_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P-0Y0M0DT7H36M16S', 0);
+
+echo "test_time_fall_type2_redost_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P-0Y0M0DT2H4M24S', 0);
+
+echo "test_time_fall_type2_redost_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P-0Y0M0DT1H2M11S', 0);
+
+echo "test_time_fall_type2_redost_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:16:54 EST');  // sp redodt, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P+0Y0M0DT0H2M10S', 0);
+
+echo "test_time_fall_type2_redost_type2_st: ";
+$end   = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P+0Y0M0DT2H2M11S', 0);
+
+echo "test_time_fall_type2_redost_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P+0Y0M1DT18H45M15S', 1);
+
+echo "test_time_fall_type2_st_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P-0Y0M0DT9H38M27S', 0);
+
+echo "test_time_fall_type2_st_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P-0Y0M0DT4H6M35S', 0);
+
+echo "test_time_fall_type2_st_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P-0Y0M0DT3H4M22S', 0);
+
+echo "test_time_fall_type2_st_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P-0Y0M0DT2H2M11S', 0);
+
+echo "test_time_fall_type2_st_type2_st: ";
+$end   = new DateTime('2010-11-07 05:19:56 EST');  // sp st, zt2
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P+0Y0M0DT2H3M1S', 0);
+
+echo "test_time_fall_type2_st_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P+0Y0M1DT16H43M4S', 1);
+
+echo "test_time_fall_type2_post_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M2DT1H21M31S', 2);
+
+echo "test_time_fall_type2_post_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+$start = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT20H49M39S', 1);
+
+echo "test_time_fall_type2_post_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT19H47M26S', 1);
+
+echo "test_time_fall_type2_post_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT18H45M15S', 1);
+
+echo "test_time_fall_type2_post_type2_st: ";
+$end   = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+$start = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT16H43M4S', 1);
+
+echo "test_time_fall_type2_post_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-08 18:57:55 EST');  // sp post, zt2
+examine_diff($end, $start, 'P+0Y0M0DT1H2M4S', 0);
+
+?>
+--EXPECT--
+test_time_fall_type2_prev_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-10-04 02:18:48 EDT = **P+0Y1M2DT16H19M40S** | BACK: 2010-10-04 02:18:48 EDT + P+0Y1M2DT16H19M40S = **2010-11-06 18:38:28 EDT** | DAYS: **33**
+test_time_fall_type2_prev_type2_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT5H31M52S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT5H31M52S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type2_prev_type2_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT6H34M5S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT6H34M5S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type2_prev_type2_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT7H36M16S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT7H36M16S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type2_prev_type2_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT9H38M27S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT9H38M27S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type2_prev_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M2DT1H21M31S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M2DT1H21M31S = **2010-11-08 19:59:59 EST** | DAYS: **2**
+test_time_fall_type2_dt_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 00:10:20 EDT = **P-0Y0M0DT5H31M52S** | BACK: 2010-11-07 00:10:20 EDT + P-0Y0M0DT5H31M52S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type2_dt_type2_dt: FWD: 2010-11-07 00:15:35 EDT - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT0H5M15S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT0H5M15S = **2010-11-07 00:15:35 EDT** | DAYS: **0**
+test_time_fall_type2_dt_type2_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT1H2M13S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT1H2M13S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type2_dt_type2_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT2H4M24S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT2H4M24S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type2_dt_type2_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT4H6M35S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT4H6M35S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type2_dt_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M1DT20H49M39S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M1DT20H49M39S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type2_redodt_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 01:12:33 EDT = **P-0Y0M0DT6H34M5S** | BACK: 2010-11-07 01:12:33 EDT + P-0Y0M0DT6H34M5S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type2_redodt_type2_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 01:12:33 EDT = **P-0Y0M0DT1H2M13S** | BACK: 2010-11-07 01:12:33 EDT + P-0Y0M0DT1H2M13S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type2_redodt_type2_redodt: FWD: 2010-11-07 01:15:35 EDT - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT0H3M2S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT0H3M2S = **2010-11-07 01:15:35 EDT** | DAYS: **0**
+test_time_fall_type2_redodt_type2_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT1H2M11S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT1H2M11S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type2_redodt_type2_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT3H4M22S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT3H4M22S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type2_redodt_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M1DT19H47M26S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M1DT19H47M26S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type2_redost_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT7H36M16S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT7H36M16S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type2_redost_type2_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT2H4M24S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT2H4M24S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type2_redost_type2_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT1H2M11S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT1H2M11S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type2_redost_type2_redost: FWD: 2010-11-07 01:16:54 EST - 2010-11-07 01:14:44 EST = **P+0Y0M0DT0H2M10S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M0DT0H2M10S = **2010-11-07 01:16:54 EST** | DAYS: **0**
+test_time_fall_type2_redost_type2_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 01:14:44 EST = **P+0Y0M0DT2H2M11S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M0DT2H2M11S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type2_redost_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 01:14:44 EST = **P+0Y0M1DT18H45M15S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M1DT18H45M15S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type2_st_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT9H38M27S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT9H38M27S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type2_st_type2_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT4H6M35S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT4H6M35S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type2_st_type2_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT3H4M22S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT3H4M22S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type2_st_type2_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 03:16:55 EST = **P-0Y0M0DT2H2M11S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT2H2M11S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type2_st_type2_st: FWD: 2010-11-07 05:19:56 EST - 2010-11-07 03:16:55 EST = **P+0Y0M0DT2H3M1S** | BACK: 2010-11-07 03:16:55 EST + P+0Y0M0DT2H3M1S = **2010-11-07 05:19:56 EST** | DAYS: **0**
+test_time_fall_type2_st_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 03:16:55 EST = **P+0Y0M1DT16H43M4S** | BACK: 2010-11-07 03:16:55 EST + P+0Y0M1DT16H43M4S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type2_post_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M2DT1H21M31S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M2DT1H21M31S = **2010-11-06 18:38:28 EDT** | DAYS: **2**
+test_time_fall_type2_post_type2_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M1DT20H49M39S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT20H49M39S = **2010-11-07 00:10:20 EDT** | DAYS: **1**
+test_time_fall_type2_post_type2_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M1DT19H47M26S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT19H47M26S = **2010-11-07 01:12:33 EDT** | DAYS: **1**
+test_time_fall_type2_post_type2_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-08 19:59:59 EST = **P-0Y0M1DT18H45M15S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT18H45M15S = **2010-11-07 01:14:44 EST** | DAYS: **1**
+test_time_fall_type2_post_type2_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-08 19:59:59 EST = **P-0Y0M1DT16H43M4S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT16H43M4S = **2010-11-07 03:16:55 EST** | DAYS: **1**
+test_time_fall_type2_post_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-08 18:57:55 EST = **P+0Y0M0DT1H2M4S** | BACK: 2010-11-08 18:57:55 EST + P+0Y0M0DT1H2M4S = **2010-11-08 19:59:59 EST** | DAYS: **0**
diff --git a/ext/date/tests/DateTime_diff_add_sub-fall-type2-type3.phpt b/ext/date/tests/DateTime_diff_add_sub-fall-type2-type3.phpt
new file mode 100644 (file)
index 0000000..61eb406
--- /dev/null
@@ -0,0 +1,258 @@
+--TEST--
+DateTime::diff() add() sub() -- fall type2 type3
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--XFAIL--
+PHP < 5.4 has bugs
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Time, Fall, Zone Type 2 to Zone Type 3
+ *
+ * + prev: the day before the transition day  2010-11-06 18:38:28 EDT
+ * + dt: daylight time on transition day      2010-11-07 00:10:20 EDT
+ * + redodt: daylight time in the redo period 2010-11-07 01:12:33 EDT
+ * + redost: standard time in the redo period 2010-11-07 01:14:44 EST
+ * + st: standard time on the transition day  2010-11-07 03:16:55 EST
+ * + post: the day after the transition day   2010-11-08 19:59:59 EST
+ */
+echo "test_time_fall_type2_prev_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-10-04 02:18:48 EDT');  // sp prev, zt2
+examine_diff($end, $start, 'P+0Y1M2DT16H19M40S', 33);
+
+echo "test_time_fall_type2_prev_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+$start = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT5H31M52S', 0);
+
+echo "test_time_fall_type2_prev_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT6H34M5S', 0);
+
+echo "test_time_fall_type2_prev_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT7H36M16S', 0);
+
+echo "test_time_fall_type2_prev_type3_st: ";
+$end   = new DateTime('2010-11-07 03:16:55');  // st, zt3
+$start = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT9H38M27S', 0);
+
+echo "test_time_fall_type2_prev_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M2DT1H21M31S', 2);
+
+echo "test_time_fall_type2_dt_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P-0Y0M0DT5H31M52S', 0);
+
+echo "test_time_fall_type2_dt_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:15:35');  // sp dt, zt3
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT0H5M15S', 0);
+
+echo "test_time_fall_type2_dt_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT1H2M13S', 0);
+
+echo "test_time_fall_type2_dt_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT2H4M24S', 0);
+
+echo "test_time_fall_type2_dt_type3_st: ";
+$end   = new DateTime('2010-11-07 03:16:55');  // st, zt3
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT4H6M35S', 0);
+
+echo "test_time_fall_type2_dt_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M1DT20H49M39S', 1);
+
+echo "test_time_fall_type2_redodt_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P-0Y0M0DT6H34M5S', 0);
+
+echo "test_time_fall_type2_redodt_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P-0Y0M0DT1H2M13S', 0);
+
+echo "test_time_fall_type2_redodt_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:15:35 EDT');  // sp redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT0H3M2S', 0);
+
+echo "test_time_fall_type2_redodt_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT1H2M11S', 0);
+
+echo "test_time_fall_type2_redodt_type3_st: ";
+$end   = new DateTime('2010-11-07 03:16:55');  // st, zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT3H4M22S', 0);
+
+echo "test_time_fall_type2_redodt_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+examine_diff($end, $start, 'P+0Y0M1DT19H47M26S', 1);
+
+echo "test_time_fall_type2_redost_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P-0Y0M0DT7H36M16S', 0);
+
+echo "test_time_fall_type2_redost_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P-0Y0M0DT2H4M24S', 0);
+
+echo "test_time_fall_type2_redost_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P-0Y0M0DT1H2M11S', 0);
+
+echo "test_time_fall_type2_redost_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:16:54 EST');  // sp redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P+0Y0M0DT0H2M10S', 0);
+
+echo "test_time_fall_type2_redost_type3_st: ";
+$end   = new DateTime('2010-11-07 03:16:55');  // st, zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P+0Y0M0DT2H2M11S', 0);
+
+echo "test_time_fall_type2_redost_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+examine_diff($end, $start, 'P+0Y0M1DT18H45M15S', 1);
+
+echo "test_time_fall_type2_st_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P-0Y0M0DT9H38M27S', 0);
+
+echo "test_time_fall_type2_st_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P-0Y0M0DT4H6M35S', 0);
+
+echo "test_time_fall_type2_st_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P-0Y0M0DT3H4M22S', 0);
+
+echo "test_time_fall_type2_st_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P-0Y0M0DT2H2M11S', 0);
+
+echo "test_time_fall_type2_st_type3_st: ";
+$end   = new DateTime('2010-11-07 05:19:56');  // sp st, zt3
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P+0Y0M0DT2H3M1S', 0);
+
+echo "test_time_fall_type2_st_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+examine_diff($end, $start, 'P+0Y0M1DT16H43M4S', 1);
+
+echo "test_time_fall_type2_post_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M2DT1H21M31S', 2);
+
+echo "test_time_fall_type2_post_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+$start = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT20H49M39S', 1);
+
+echo "test_time_fall_type2_post_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT19H47M26S', 1);
+
+echo "test_time_fall_type2_post_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT18H45M15S', 1);
+
+echo "test_time_fall_type2_post_type3_st: ";
+$end   = new DateTime('2010-11-07 03:16:55');  // st, zt3
+$start = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT16H43M4S', 1);
+
+echo "test_time_fall_type2_post_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-08 18:57:55 EST');  // sp post, zt2
+examine_diff($end, $start, 'P+0Y0M0DT1H2M4S', 0);
+
+?>
+--EXPECT--
+test_time_fall_type2_prev_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-10-04 02:18:48 EDT = **P+0Y1M2DT16H19M40S** | BACK: 2010-10-04 02:18:48 EDT + P+0Y1M2DT16H19M40S = **2010-11-06 18:38:28 EDT** | DAYS: **33**
+test_time_fall_type2_prev_type3_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT5H31M52S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT5H31M52S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type2_prev_type3_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT6H34M5S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT6H34M5S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type2_prev_type3_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT7H36M16S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT7H36M16S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type2_prev_type3_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT9H38M27S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT9H38M27S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type2_prev_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M2DT1H21M31S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M2DT1H21M31S = **2010-11-08 19:59:59 EST** | DAYS: **2**
+test_time_fall_type2_dt_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 00:10:20 EDT = **P-0Y0M0DT5H31M52S** | BACK: 2010-11-07 00:10:20 EDT + P-0Y0M0DT5H31M52S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type2_dt_type3_dt: FWD: 2010-11-07 00:15:35 EDT - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT0H5M15S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT0H5M15S = **2010-11-07 00:15:35 EDT** | DAYS: **0**
+test_time_fall_type2_dt_type3_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT1H2M13S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT1H2M13S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type2_dt_type3_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT2H4M24S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT2H4M24S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type2_dt_type3_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT4H6M35S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT4H6M35S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type2_dt_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M1DT20H49M39S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M1DT20H49M39S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type2_redodt_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 01:12:33 EDT = **P-0Y0M0DT6H34M5S** | BACK: 2010-11-07 01:12:33 EDT + P-0Y0M0DT6H34M5S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type2_redodt_type3_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 01:12:33 EDT = **P-0Y0M0DT1H2M13S** | BACK: 2010-11-07 01:12:33 EDT + P-0Y0M0DT1H2M13S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type2_redodt_type3_redodt: FWD: 2010-11-07 01:15:35 EDT - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT0H3M2S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT0H3M2S = **2010-11-07 01:15:35 EDT** | DAYS: **0**
+test_time_fall_type2_redodt_type3_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT1H2M11S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT1H2M11S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type2_redodt_type3_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT3H4M22S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT3H4M22S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type2_redodt_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M1DT19H47M26S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M1DT19H47M26S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type2_redost_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT7H36M16S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT7H36M16S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type2_redost_type3_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT2H4M24S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT2H4M24S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type2_redost_type3_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT1H2M11S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT1H2M11S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type2_redost_type3_redost: FWD: 2010-11-07 01:16:54 EST - 2010-11-07 01:14:44 EST = **P+0Y0M0DT0H2M10S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M0DT0H2M10S = **2010-11-07 01:16:54 EST** | DAYS: **0**
+test_time_fall_type2_redost_type3_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 01:14:44 EST = **P+0Y0M0DT2H2M11S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M0DT2H2M11S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type2_redost_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 01:14:44 EST = **P+0Y0M1DT18H45M15S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M1DT18H45M15S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type2_st_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT9H38M27S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT9H38M27S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type2_st_type3_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT4H6M35S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT4H6M35S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type2_st_type3_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT3H4M22S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT3H4M22S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type2_st_type3_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 03:16:55 EST = **P-0Y0M0DT2H2M11S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT2H2M11S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type2_st_type3_st: FWD: 2010-11-07 05:19:56 EST - 2010-11-07 03:16:55 EST = **P+0Y0M0DT2H3M1S** | BACK: 2010-11-07 03:16:55 EST + P+0Y0M0DT2H3M1S = **2010-11-07 05:19:56 EST** | DAYS: **0**
+test_time_fall_type2_st_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 03:16:55 EST = **P+0Y0M1DT16H43M4S** | BACK: 2010-11-07 03:16:55 EST + P+0Y0M1DT16H43M4S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type2_post_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M2DT1H21M31S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M2DT1H21M31S = **2010-11-06 18:38:28 EDT** | DAYS: **2**
+test_time_fall_type2_post_type3_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M1DT20H49M39S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT20H49M39S = **2010-11-07 00:10:20 EDT** | DAYS: **1**
+test_time_fall_type2_post_type3_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M1DT19H47M26S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT19H47M26S = **2010-11-07 01:12:33 EDT** | DAYS: **1**
+test_time_fall_type2_post_type3_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-08 19:59:59 EST = **P-0Y0M1DT18H45M15S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT18H45M15S = **2010-11-07 01:14:44 EST** | DAYS: **1**
+test_time_fall_type2_post_type3_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-08 19:59:59 EST = **P-0Y0M1DT16H43M4S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT16H43M4S = **2010-11-07 03:16:55 EST** | DAYS: **1**
+test_time_fall_type2_post_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-08 18:57:55 EST = **P+0Y0M0DT1H2M4S** | BACK: 2010-11-08 18:57:55 EST + P+0Y0M0DT1H2M4S = **2010-11-08 19:59:59 EST** | DAYS: **0**
diff --git a/ext/date/tests/DateTime_diff_add_sub-fall-type3-type2.phpt b/ext/date/tests/DateTime_diff_add_sub-fall-type3-type2.phpt
new file mode 100644 (file)
index 0000000..fd57a54
--- /dev/null
@@ -0,0 +1,260 @@
+--TEST--
+DateTime::diff() add() sub() -- fall type3 type2
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--XFAIL--
+PHP < 5.4 has bugs
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Time, Fall, Zone Type 3 to Zone Type 2
+ *
+ * + prev: the day before the transition day  2010-11-06 18:38:28 EDT
+ * + dt: daylight time on transition day      2010-11-07 00:10:20 EDT
+ * + redodt: daylight time in the redo period 2010-11-07 01:12:33 EDT
+ * + redost: standard time in the redo period 2010-11-07 01:14:44 EST
+ * + st: standard time on the transition day  2010-11-07 03:16:55 EST
+ * + post: the day after the transition day   2010-11-08 19:59:59 EST
+ */
+echo "test_time_fall_type3_prev_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-10-04 02:18:48');  // sp prev, zt3
+examine_diff($end, $start, 'P+0Y1M2DT16H19M40S', 33);
+
+echo "test_time_fall_type3_prev_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+$start = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT5H31M52S', 0);
+
+echo "test_time_fall_type3_prev_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT6H34M5S', 0);
+
+echo "test_time_fall_type3_prev_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT7H36M16S', 0);
+
+echo "test_time_fall_type3_prev_type2_st: ";
+$end   = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+$start = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT9H38M27S', 0);
+
+echo "test_time_fall_type3_prev_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M2DT1H21M31S', 2);
+
+echo "test_time_fall_type3_dt_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P-0Y0M0DT5H31M52S', 0);
+
+echo "test_time_fall_type3_dt_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:15:35 EDT');  // sp dt, zt2
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M0DT0H5M15S', 0);
+
+echo "test_time_fall_type3_dt_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M0DT1H2M13S', 0);
+
+echo "test_time_fall_type3_dt_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M0DT2H4M24S', 0);
+
+echo "test_time_fall_type3_dt_type2_st: ";
+$end   = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M0DT4H6M35S', 0);
+
+echo "test_time_fall_type3_dt_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M1DT20H49M39S', 1);
+
+echo "test_time_fall_type3_redodt_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P-0Y0M0DT6H34M5S', 0);
+
+echo "test_time_fall_type3_redodt_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P-0Y0M0DT1H2M13S', 0);
+
+echo "test_time_fall_type3_redodt_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:15:35 EDT');  // sp redodt, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M0DT0H3M2S', 0);
+
+echo "test_time_fall_type3_redodt_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M0DT1H2M11S', 0);
+
+echo "test_time_fall_type3_redodt_type2_st: ";
+$end   = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M0DT3H4M22S', 0);
+
+echo "test_time_fall_type3_redodt_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M1DT19H47M26S', 1);
+
+echo "test_time_fall_type3_redost_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P-0Y0M0DT7H36M16S', 0);
+
+echo "test_time_fall_type3_redost_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P-0Y0M0DT2H4M24S', 0);
+
+echo "test_time_fall_type3_redost_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P-0Y0M0DT1H2M11S', 0);
+
+echo "test_time_fall_type3_redost_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:16:54 EST');  // sp redodt, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M0DT0H2M10S', 0);
+
+echo "test_time_fall_type3_redost_type2_st: ";
+$end   = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M0DT2H2M11S', 0);
+
+echo "test_time_fall_type3_redost_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M1DT18H45M15S', 1);
+
+echo "test_time_fall_type3_st_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P-0Y0M0DT9H38M27S', 0);
+
+echo "test_time_fall_type3_st_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P-0Y0M0DT4H6M35S', 0);
+
+echo "test_time_fall_type3_st_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P-0Y0M0DT3H4M22S', 0);
+
+echo "test_time_fall_type3_st_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P-0Y0M0DT2H2M11S', 0);
+
+echo "test_time_fall_type3_st_type2_st: ";
+$end   = new DateTime('2010-11-07 05:19:56 EST');  // sp st, zt2
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P+0Y0M0DT2H3M1S', 0);
+
+echo "test_time_fall_type3_st_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P+0Y0M1DT16H43M4S', 1);
+
+echo "test_time_fall_type3_post_type2_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28 EDT');  // prev, zt2
+$start = new DateTime('2010-11-08 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M2DT1H21M31S', 2);
+
+echo "test_time_fall_type3_post_type2_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20 EDT');  // dt, zt2
+$start = new DateTime('2010-11-08 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT20H49M39S', 1);
+
+echo "test_time_fall_type3_post_type2_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start = new DateTime('2010-11-08 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT19H47M26S', 1);
+
+echo "test_time_fall_type3_post_type2_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start = new DateTime('2010-11-08 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT18H45M15S', 1);
+
+echo "test_time_fall_type3_post_type2_st: ";
+$end   = new DateTime('2010-11-07 03:16:55 EST');  // st, zt2
+$start = new DateTime('2010-11-08 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT16H43M4S', 1);
+
+echo "test_time_fall_type3_post_type2_post: ";
+$end   = new DateTime('2010-11-08 19:59:59 EST');  // post, zt2
+$start = new DateTime('2010-11-08 18:57:55');  // sp post, zt3
+examine_diff($end, $start, 'P+0Y0M0DT1H2M4S', 0);
+
+?>
+--EXPECT--
+test_time_fall_type3_prev_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-10-04 02:18:48 EDT = **P+0Y1M2DT16H19M40S** | BACK: 2010-10-04 02:18:48 EDT + P+0Y1M2DT16H19M40S = **2010-11-06 18:38:28 EDT** | DAYS: **33**
+test_time_fall_type3_prev_type2_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT5H31M52S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT5H31M52S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type3_prev_type2_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT6H34M5S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT6H34M5S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type3_prev_type2_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT7H36M16S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT7H36M16S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type3_prev_type2_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT9H38M27S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT9H38M27S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type3_prev_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M2DT1H21M31S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M2DT1H21M31S = **2010-11-08 19:59:59 EST** | DAYS: **2**
+test_time_fall_type3_dt_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 00:10:20 EDT = **P-0Y0M0DT5H31M52S** | BACK: 2010-11-07 00:10:20 EDT + P-0Y0M0DT5H31M52S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type3_dt_type2_dt: FWD: 2010-11-07 00:15:35 EDT - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT0H5M15S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT0H5M15S = **2010-11-07 00:15:35 EDT** | DAYS: **0**
+test_time_fall_type3_dt_type2_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT1H2M13S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT1H2M13S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type3_dt_type2_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT2H4M24S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT2H4M24S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type3_dt_type2_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT4H6M35S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT4H6M35S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type3_dt_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M1DT20H49M39S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M1DT20H49M39S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type3_redodt_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 01:12:33 EDT = **P-0Y0M0DT6H34M5S** | BACK: 2010-11-07 01:12:33 EDT + P-0Y0M0DT6H34M5S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type3_redodt_type2_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 01:12:33 EDT = **P-0Y0M0DT1H2M13S** | BACK: 2010-11-07 01:12:33 EDT + P-0Y0M0DT1H2M13S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type3_redodt_type2_redodt: FWD: 2010-11-07 01:15:35 EDT - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT0H3M2S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT0H3M2S = **2010-11-07 01:15:35 EDT** | DAYS: **0**
+test_time_fall_type3_redodt_type2_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT1H2M11S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT1H2M11S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type3_redodt_type2_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT3H4M22S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT3H4M22S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type3_redodt_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M1DT19H47M26S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M1DT19H47M26S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type3_redost_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT7H36M16S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT7H36M16S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type3_redost_type2_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT2H4M24S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT2H4M24S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type3_redost_type2_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT1H2M11S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT1H2M11S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type3_redost_type2_redost: FWD: 2010-11-07 01:16:54 EST - 2010-11-07 01:14:44 EST = **P+0Y0M0DT0H2M10S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M0DT0H2M10S = **2010-11-07 01:16:54 EST** | DAYS: **0**
+test_time_fall_type3_redost_type2_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 01:14:44 EST = **P+0Y0M0DT2H2M11S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M0DT2H2M11S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type3_redost_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 01:14:44 EST = **P+0Y0M1DT18H45M15S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M1DT18H45M15S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type3_st_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT9H38M27S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT9H38M27S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type3_st_type2_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT4H6M35S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT4H6M35S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type3_st_type2_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT3H4M22S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT3H4M22S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type3_st_type2_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 03:16:55 EST = **P-0Y0M0DT2H2M11S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT2H2M11S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type3_st_type2_st: FWD: 2010-11-07 05:19:56 EST - 2010-11-07 03:16:55 EST = **P+0Y0M0DT2H3M1S** | BACK: 2010-11-07 03:16:55 EST + P+0Y0M0DT2H3M1S = **2010-11-07 05:19:56 EST** | DAYS: **0**
+test_time_fall_type3_st_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 03:16:55 EST = **P+0Y0M1DT16H43M4S** | BACK: 2010-11-07 03:16:55 EST + P+0Y0M1DT16H43M4S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type3_post_type2_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M2DT1H21M31S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M2DT1H21M31S = **2010-11-06 18:38:28 EDT** | DAYS: **2**
+test_time_fall_type3_post_type2_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M1DT20H49M39S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT20H49M39S = **2010-11-07 00:10:20 EDT** | DAYS: **1**
+test_time_fall_type3_post_type2_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M1DT19H47M26S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT19H47M26S = **2010-11-07 01:12:33 EDT** | DAYS: **1**
+test_time_fall_type3_post_type2_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-08 19:59:59 EST = **P-0Y0M1DT18H45M15S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT18H45M15S = **2010-11-07 01:14:44 EST** | DAYS: **1**
+test_time_fall_type3_post_type2_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-08 19:59:59 EST = **P-0Y0M1DT16H43M4S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT16H43M4S = **2010-11-07 03:16:55 EST** | DAYS: **1**
+test_time_fall_type3_post_type2_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-08 18:57:55 EST = **P+0Y0M0DT1H2M4S** | BACK: 2010-11-08 18:57:55 EST + P+0Y0M0DT1H2M4S = **2010-11-08 19:59:59 EST** | DAYS: **0**
diff --git a/ext/date/tests/DateTime_diff_add_sub-fall-type3-type3.phpt b/ext/date/tests/DateTime_diff_add_sub-fall-type3-type3.phpt
new file mode 100644 (file)
index 0000000..9aac2f1
--- /dev/null
@@ -0,0 +1,270 @@
+--TEST--
+DateTime::diff() add() sub() -- fall type3 type3 
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--XFAIL--
+PHP < 5.4 has bugs
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Time, Fall, Zone Type 3 to Zone Type 3
+ *
+ * + prev: the day before the transition day  2010-11-06 18:38:28
+ * + dt: daylight time on transition day      2010-11-07 00:10:20
+ * + redodt: daylight time in the redo period 2010-11-07 01:12:33 EDT, + TZ
+ * + redost: standard time in the redo period 2010-11-07 01:14:44 EST, + TZ
+ * + st: standard time on the transition day  2010-11-07 03:16:55
+ * + post: the day after the transition day   2010-11-08 19:59:59
+ */
+echo "test_time_fall_type3_prev_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-10-04 02:18:48');  // sp prev, zt3
+examine_diff($end, $start, 'P+0Y1M2DT16H19M40S', 33);
+
+echo "test_time_fall_type3_prev_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+$start = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT5H31M52S', 0);
+
+echo "test_time_fall_type3_prev_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT6H34M5S', 0);
+
+echo "test_time_fall_type3_prev_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT7H36M16S', 0);
+
+echo "test_time_fall_type3_prev_type3_st: ";
+$end   = new DateTime('2010-11-07 03:16:55');  // st, zt3
+$start = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT9H38M27S', 0);
+
+echo "test_time_fall_type3_prev_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M2DT1H21M31S', 2);
+
+echo "test_time_fall_type3_dt_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P-0Y0M0DT5H31M52S', 0);
+
+echo "test_time_fall_type3_dt_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:15:35');  // sp dt, zt3
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M0DT0H5M15S', 0);
+
+echo "test_time_fall_type3_dt_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M0DT1H2M13S', 0);
+
+echo "test_time_fall_type3_dt_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M0DT2H4M24S', 0);
+
+echo "test_time_fall_type3_dt_type3_st: ";
+$end   = new DateTime('2010-11-07 03:16:55');  // st, zt3
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M0DT4H6M35S', 0);
+
+echo "test_time_fall_type3_dt_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M1DT20H49M39S', 1);
+
+echo "test_time_fall_type3_redodt_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P-0Y0M0DT6H34M5S', 0);
+
+echo "test_time_fall_type3_redodt_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P-0Y0M0DT1H2M13S', 0);
+
+echo "test_time_fall_type3_redodt_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:15:35 EDT');  // sp redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M0DT0H3M2S', 0);
+
+echo "test_time_fall_type3_redodt_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M0DT1H2M11S', 0);
+
+echo "test_time_fall_type3_redodt_type3_st: ";
+$end   = new DateTime('2010-11-07 03:16:55');  // st, zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M0DT3H4M22S', 0);
+
+echo "test_time_fall_type3_redodt_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M1DT19H47M26S', 1);
+
+echo "test_time_fall_type3_redost_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P-0Y0M0DT7H36M16S', 0);
+
+echo "test_time_fall_type3_redost_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P-0Y0M0DT2H4M24S', 0);
+
+echo "test_time_fall_type3_redost_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P-0Y0M0DT1H2M11S', 0);
+
+echo "test_time_fall_type3_redost_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:16:54 EST');  // sp redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M0DT0H2M10S', 0);
+
+echo "test_time_fall_type3_redost_type3_st: ";
+$end   = new DateTime('2010-11-07 03:16:55');  // st, zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M0DT2H2M11S', 0);
+
+echo "test_time_fall_type3_redost_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$start->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+examine_diff($end, $start, 'P+0Y0M1DT18H45M15S', 1);
+
+echo "test_time_fall_type3_st_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P-0Y0M0DT9H38M27S', 0);
+
+echo "test_time_fall_type3_st_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P-0Y0M0DT4H6M35S', 0);
+
+echo "test_time_fall_type3_st_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P-0Y0M0DT3H4M22S', 0);
+
+echo "test_time_fall_type3_st_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P-0Y0M0DT2H2M11S', 0);
+
+echo "test_time_fall_type3_st_type3_st: ";
+$end   = new DateTime('2010-11-07 05:19:56');  // sp st, zt3
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P+0Y0M0DT2H3M1S', 0);
+
+echo "test_time_fall_type3_st_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-07 03:16:55');  // st, zt3
+examine_diff($end, $start, 'P+0Y0M1DT16H43M4S', 1);
+
+echo "test_time_fall_type3_post_type3_prev: ";
+$end   = new DateTime('2010-11-06 18:38:28');  // prev, zt3
+$start = new DateTime('2010-11-08 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M2DT1H21M31S', 2);
+
+echo "test_time_fall_type3_post_type3_dt: ";
+$end   = new DateTime('2010-11-07 00:10:20');  // dt, zt3
+$start = new DateTime('2010-11-08 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT20H49M39S', 1);
+
+echo "test_time_fall_type3_post_type3_redodt: ";
+$end   = new DateTime('2010-11-07 01:12:33 EDT');  // redodt, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-08 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT19H47M26S', 1);
+
+echo "test_time_fall_type3_post_type3_redost: ";
+$end   = new DateTime('2010-11-07 01:14:44 EST');  // redost, zt2
+$end->setTimezone(new DateTimeZone('America/New_York'));  // zt2 -> zt3
+$start = new DateTime('2010-11-08 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT18H45M15S', 1);
+
+echo "test_time_fall_type3_post_type3_st: ";
+$end   = new DateTime('2010-11-07 03:16:55');  // st, zt3
+$start = new DateTime('2010-11-08 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT16H43M4S', 1);
+
+echo "test_time_fall_type3_post_type3_post: ";
+$end   = new DateTime('2010-11-08 19:59:59');  // post, zt3
+$start = new DateTime('2010-11-08 18:57:55');  // sp post, zt3
+examine_diff($end, $start, 'P+0Y0M0DT1H2M4S', 0);
+
+?>
+--EXPECT--
+test_time_fall_type3_prev_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-10-04 02:18:48 EDT = **P+0Y1M2DT16H19M40S** | BACK: 2010-10-04 02:18:48 EDT + P+0Y1M2DT16H19M40S = **2010-11-06 18:38:28 EDT** | DAYS: **33**
+test_time_fall_type3_prev_type3_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT5H31M52S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT5H31M52S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type3_prev_type3_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT6H34M5S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT6H34M5S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type3_prev_type3_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT7H36M16S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT7H36M16S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type3_prev_type3_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M0DT9H38M27S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M0DT9H38M27S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type3_prev_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-06 18:38:28 EDT = **P+0Y0M2DT1H21M31S** | BACK: 2010-11-06 18:38:28 EDT + P+0Y0M2DT1H21M31S = **2010-11-08 19:59:59 EST** | DAYS: **2**
+test_time_fall_type3_dt_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 00:10:20 EDT = **P-0Y0M0DT5H31M52S** | BACK: 2010-11-07 00:10:20 EDT + P-0Y0M0DT5H31M52S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type3_dt_type3_dt: FWD: 2010-11-07 00:15:35 EDT - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT0H5M15S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT0H5M15S = **2010-11-07 00:15:35 EDT** | DAYS: **0**
+test_time_fall_type3_dt_type3_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT1H2M13S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT1H2M13S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type3_dt_type3_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT2H4M24S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT2H4M24S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type3_dt_type3_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M0DT4H6M35S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M0DT4H6M35S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type3_dt_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 00:10:20 EDT = **P+0Y0M1DT20H49M39S** | BACK: 2010-11-07 00:10:20 EDT + P+0Y0M1DT20H49M39S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type3_redodt_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 01:12:33 EDT = **P-0Y0M0DT6H34M5S** | BACK: 2010-11-07 01:12:33 EDT + P-0Y0M0DT6H34M5S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type3_redodt_type3_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 01:12:33 EDT = **P-0Y0M0DT1H2M13S** | BACK: 2010-11-07 01:12:33 EDT + P-0Y0M0DT1H2M13S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type3_redodt_type3_redodt: FWD: 2010-11-07 01:15:35 EDT - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT0H3M2S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT0H3M2S = **2010-11-07 01:15:35 EDT** | DAYS: **0**
+test_time_fall_type3_redodt_type3_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT1H2M11S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT1H2M11S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type3_redodt_type3_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M0DT3H4M22S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M0DT3H4M22S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type3_redodt_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 01:12:33 EDT = **P+0Y0M1DT19H47M26S** | BACK: 2010-11-07 01:12:33 EDT + P+0Y0M1DT19H47M26S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type3_redost_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT7H36M16S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT7H36M16S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type3_redost_type3_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT2H4M24S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT2H4M24S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type3_redost_type3_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 01:14:44 EST = **P-0Y0M0DT1H2M11S** | BACK: 2010-11-07 01:14:44 EST + P-0Y0M0DT1H2M11S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type3_redost_type3_redost: FWD: 2010-11-07 01:16:54 EST - 2010-11-07 01:14:44 EST = **P+0Y0M0DT0H2M10S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M0DT0H2M10S = **2010-11-07 01:16:54 EST** | DAYS: **0**
+test_time_fall_type3_redost_type3_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-07 01:14:44 EST = **P+0Y0M0DT2H2M11S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M0DT2H2M11S = **2010-11-07 03:16:55 EST** | DAYS: **0**
+test_time_fall_type3_redost_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 01:14:44 EST = **P+0Y0M1DT18H45M15S** | BACK: 2010-11-07 01:14:44 EST + P+0Y0M1DT18H45M15S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type3_st_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT9H38M27S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT9H38M27S = **2010-11-06 18:38:28 EDT** | DAYS: **0**
+test_time_fall_type3_st_type3_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT4H6M35S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT4H6M35S = **2010-11-07 00:10:20 EDT** | DAYS: **0**
+test_time_fall_type3_st_type3_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-07 03:16:55 EST = **P-0Y0M0DT3H4M22S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT3H4M22S = **2010-11-07 01:12:33 EDT** | DAYS: **0**
+test_time_fall_type3_st_type3_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-07 03:16:55 EST = **P-0Y0M0DT2H2M11S** | BACK: 2010-11-07 03:16:55 EST + P-0Y0M0DT2H2M11S = **2010-11-07 01:14:44 EST** | DAYS: **0**
+test_time_fall_type3_st_type3_st: FWD: 2010-11-07 05:19:56 EST - 2010-11-07 03:16:55 EST = **P+0Y0M0DT2H3M1S** | BACK: 2010-11-07 03:16:55 EST + P+0Y0M0DT2H3M1S = **2010-11-07 05:19:56 EST** | DAYS: **0**
+test_time_fall_type3_st_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-07 03:16:55 EST = **P+0Y0M1DT16H43M4S** | BACK: 2010-11-07 03:16:55 EST + P+0Y0M1DT16H43M4S = **2010-11-08 19:59:59 EST** | DAYS: **1**
+test_time_fall_type3_post_type3_prev: FWD: 2010-11-06 18:38:28 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M2DT1H21M31S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M2DT1H21M31S = **2010-11-06 18:38:28 EDT** | DAYS: **2**
+test_time_fall_type3_post_type3_dt: FWD: 2010-11-07 00:10:20 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M1DT20H49M39S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT20H49M39S = **2010-11-07 00:10:20 EDT** | DAYS: **1**
+test_time_fall_type3_post_type3_redodt: FWD: 2010-11-07 01:12:33 EDT - 2010-11-08 19:59:59 EST = **P-0Y0M1DT19H47M26S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT19H47M26S = **2010-11-07 01:12:33 EDT** | DAYS: **1**
+test_time_fall_type3_post_type3_redost: FWD: 2010-11-07 01:14:44 EST - 2010-11-08 19:59:59 EST = **P-0Y0M1DT18H45M15S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT18H45M15S = **2010-11-07 01:14:44 EST** | DAYS: **1**
+test_time_fall_type3_post_type3_st: FWD: 2010-11-07 03:16:55 EST - 2010-11-08 19:59:59 EST = **P-0Y0M1DT16H43M4S** | BACK: 2010-11-08 19:59:59 EST + P-0Y0M1DT16H43M4S = **2010-11-07 03:16:55 EST** | DAYS: **1**
+test_time_fall_type3_post_type3_post: FWD: 2010-11-08 19:59:59 EST - 2010-11-08 18:57:55 EST = **P+0Y0M0DT1H2M4S** | BACK: 2010-11-08 18:57:55 EST + P+0Y0M0DT1H2M4S = **2010-11-08 19:59:59 EST** | DAYS: **0**
diff --git a/ext/date/tests/DateTime_diff_add_sub-february.phpt b/ext/date/tests/DateTime_diff_add_sub-february.phpt
new file mode 100644 (file)
index 0000000..5a2f9d4
--- /dev/null
@@ -0,0 +1,281 @@
+--TEST--
+DateTime::diff() add() sub() -- february 
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Check PHP bug 49081
+ */
+echo "test_bug_49081__1: ";
+examine_diff('2010-03-31', '2010-03-01', 'P+0Y0M30DT0H0M0S', 30);
+
+echo "test_bug_49081__2: ";
+examine_diff('2010-04-01', '2010-03-01', 'P+0Y1M0DT0H0M0S', 31);
+
+echo "test_bug_49081__3: ";
+examine_diff('2010-04-01', '2010-03-31', 'P+0Y0M1DT0H0M0S', 1);
+
+echo "test_bug_49081__4: ";
+examine_diff('2010-04-29', '2010-03-31', 'P+0Y0M29DT0H0M0S', 29);
+
+echo "test_bug_49081__5: ";
+examine_diff('2010-04-30', '2010-03-31', 'P+0Y0M30DT0H0M0S', 30);
+
+echo "test_bug_49081__6: ";
+examine_diff('2010-04-30', '2010-03-30', 'P+0Y1M0DT0H0M0S', 31);
+
+echo "test_bug_49081__7: ";
+examine_diff('2010-04-30', '2010-03-29', 'P+0Y1M1DT0H0M0S', 32);
+
+echo "test_bug_49081__8: ";
+examine_diff('2010-01-29', '2010-01-01', 'P+0Y0M28DT0H0M0S', 28);
+
+echo "test_bug_49081__9: ";
+examine_diff('2010-01-30', '2010-01-01', 'P+0Y0M29DT0H0M0S', 29);
+
+echo "test_bug_49081__10: ";
+examine_diff('2010-01-31', '2010-01-01', 'P+0Y0M30DT0H0M0S', 30);
+
+echo "test_bug_49081__11: ";
+examine_diff('2010-02-01', '2010-01-01', 'P+0Y1M0DT0H0M0S', 31);
+
+echo "test_bug_49081__12: ";
+examine_diff('2010-02-01', '2010-01-31', 'P+0Y0M1DT0H0M0S', 1);
+
+echo "test_bug_49081__13: ";
+examine_diff('2010-02-27', '2010-01-31', 'P+0Y0M27DT0H0M0S', 27);
+
+echo "test_bug_49081__14: ";
+examine_diff('2010-02-28', '2010-01-31', 'P+0Y0M28DT0H0M0S', 28);
+
+echo "test_bug_49081__15: ";
+examine_diff('2010-02-28', '2010-01-30', 'P+0Y0M29DT0H0M0S', 29);
+
+echo "test_bug_49081__16: ";
+examine_diff('2010-02-28', '2010-01-29', 'P+0Y0M30DT0H0M0S', 30);
+
+echo "test_bug_49081__17: ";
+examine_diff('2010-02-28', '2010-01-28', 'P+0Y1M0DT0H0M0S', 31);
+
+echo "test_bug_49081__18: ";
+examine_diff('2010-02-28', '2010-01-27', 'P+0Y1M1DT0H0M0S', 32);
+
+echo "test_bug_49081__19: ";
+examine_diff('2010-03-01', '2010-01-01', 'P+0Y2M0DT0H0M0S', 59);
+
+echo "test_bug_49081__20: ";
+examine_diff('2010-03-01', '2010-01-31', 'P+0Y0M29DT0H0M0S', 29);
+
+echo "test_bug_49081__21: ";
+examine_diff('2010-03-27', '2010-01-31', 'P+0Y1M24DT0H0M0S', 55);
+
+echo "test_bug_49081__22: ";
+examine_diff('2010-03-28', '2010-01-31', 'P+0Y1M25DT0H0M0S', 56);
+
+echo "test_bug_49081__23: ";
+examine_diff('2010-03-29', '2010-01-31', 'P+0Y1M26DT0H0M0S', 57);
+
+echo "test_bug_49081__24: ";
+examine_diff('2010-03-30', '2010-01-31', 'P+0Y1M27DT0H0M0S', 58);
+
+echo "test_bug_49081__25: ";
+examine_diff('2010-03-31', '2010-01-31', 'P+0Y2M0DT0H0M0S', 59);
+
+echo "test_bug_49081__26: ";
+examine_diff('2010-03-31', '2010-01-30', 'P+0Y2M1DT0H0M0S', 60);
+
+echo "test_bug_49081__27: ";
+examine_diff('2009-01-31', '2009-01-01', 'P+0Y0M30DT0H0M0S', 30);
+
+echo "test_bug_49081__28: ";
+examine_diff('2010-03-27', '2010-02-28', 'P+0Y0M27DT0H0M0S', 27);
+
+echo "test_bug_49081__29: ";
+examine_diff('2010-03-28', '2010-02-28', 'P+0Y1M0DT0H0M0S', 28);
+
+echo "test_bug_49081__30: ";
+examine_diff('2010-03-29', '2010-02-28', 'P+0Y1M1DT0H0M0S', 29);
+
+echo "test_bug_49081__31: ";
+examine_diff('2010-03-27', '2010-02-27', 'P+0Y1M0DT0H0M0S', 28);
+
+echo "test_bug_49081__32: ";
+examine_diff('2010-03-27', '2010-02-26', 'P+0Y1M1DT0H0M0S', 29);
+
+
+/*
+ * Check PHP bug 49081, negative
+ */
+echo "test_bug_49081_negative__1: ";
+examine_diff('2010-03-01', '2010-03-31', 'P-0Y0M30DT0H0M0S', 30);
+
+echo "test_bug_49081_negative__2: ";
+examine_diff('2010-03-01', '2010-04-01', 'P-0Y1M0DT0H0M0S', 31);
+
+echo "test_bug_49081_negative__3: ";
+examine_diff('2010-03-31', '2010-04-01', 'P-0Y0M1DT0H0M0S', 1);
+
+echo "test_bug_49081_negative__4: ";
+examine_diff('2010-03-31', '2010-04-29', 'P-0Y0M29DT0H0M0S', 29);
+
+echo "test_bug_49081_negative__5: ";
+examine_diff('2010-03-31', '2010-04-30', 'P-0Y0M30DT0H0M0S', 30);
+
+echo "test_bug_49081_negative__6: ";
+examine_diff('2010-03-30', '2010-04-30', 'P-0Y1M0DT0H0M0S', 31);
+
+echo "test_bug_49081_negative__7: ";
+examine_diff('2010-03-29', '2010-04-30', 'P-0Y1M1DT0H0M0S', 32);
+
+echo "test_bug_49081_negative__8: ";
+examine_diff('2010-01-01', '2010-01-29', 'P-0Y0M28DT0H0M0S', 28);
+
+echo "test_bug_49081_negative__9: ";
+examine_diff('2010-01-01', '2010-01-30', 'P-0Y0M29DT0H0M0S', 29);
+
+echo "test_bug_49081_negative__10: ";
+examine_diff('2010-01-01', '2010-01-31', 'P-0Y0M30DT0H0M0S', 30);
+
+echo "test_bug_49081_negative__11: ";
+examine_diff('2010-01-01', '2010-02-01', 'P-0Y1M0DT0H0M0S', 31);
+
+echo "test_bug_49081_negative__12: ";
+examine_diff('2010-01-31', '2010-02-01', 'P-0Y0M1DT0H0M0S', 1);
+
+echo "test_bug_49081_negative__13: ";
+examine_diff('2010-01-31', '2010-02-27', 'P-0Y0M27DT0H0M0S', 27);
+
+echo "test_bug_49081_negative__14: ";
+examine_diff('2010-01-31', '2010-02-28', 'P-0Y0M28DT0H0M0S', 28);
+
+echo "test_bug_49081_negative__15: ";
+examine_diff('2010-01-30', '2010-02-28', 'P-0Y0M29DT0H0M0S', 29);
+
+echo "test_bug_49081_negative__16: ";
+examine_diff('2010-01-29', '2010-02-28', 'P-0Y0M30DT0H0M0S', 30);
+
+echo "test_bug_49081_negative__17: ";
+examine_diff('2010-01-28', '2010-02-28', 'P-0Y1M0DT0H0M0S', 31);
+
+echo "test_bug_49081_negative__18: ";
+examine_diff('2010-01-27', '2010-02-28', 'P-0Y1M1DT0H0M0S', 32);
+
+echo "test_bug_49081_negative__19: ";
+examine_diff('2010-01-01', '2010-03-01', 'P-0Y2M0DT0H0M0S', 59);
+
+echo "test_bug_49081_negative__20: ";
+examine_diff('2010-01-31', '2010-03-01', 'P-0Y1M1DT0H0M0S', 29);
+
+echo "test_bug_49081_negative__21: ";
+examine_diff('2010-01-31', '2010-03-27', 'P-0Y1M27DT0H0M0S', 55);
+
+echo "test_bug_49081_negative__22: ";
+examine_diff('2010-01-31', '2010-03-28', 'P-0Y1M28DT0H0M0S', 56);
+
+echo "test_bug_49081_negative__23: ";
+examine_diff('2010-01-31', '2010-03-29', 'P-0Y1M29DT0H0M0S', 57);
+
+echo "test_bug_49081_negative__24: ";
+examine_diff('2010-01-31', '2010-03-30', 'P-0Y1M30DT0H0M0S', 58);
+
+echo "test_bug_49081_negative__25: ";
+examine_diff('2010-01-31', '2010-03-31', 'P-0Y2M0DT0H0M0S', 59);
+
+echo "test_bug_49081_negative__26: ";
+examine_diff('2010-01-30', '2010-03-31', 'P-0Y2M1DT0H0M0S', 60);
+
+echo "test_bug_49081_negative__27: ";
+examine_diff('2009-01-01', '2009-01-31', 'P-0Y0M30DT0H0M0S', 30);
+
+echo "test_bug_49081_negative__28: ";
+examine_diff('2010-02-28', '2010-03-27', 'P-0Y0M27DT0H0M0S', 27);
+
+echo "test_bug_49081_negative__29: ";
+examine_diff('2010-02-28', '2010-03-28', 'P-0Y1M0DT0H0M0S', 28);
+
+echo "test_bug_49081_negative__30: ";
+examine_diff('2010-02-28', '2010-03-29', 'P-0Y1M1DT0H0M0S', 29);
+
+echo "test_bug_49081_negative__31: ";
+examine_diff('2010-02-27', '2010-03-27', 'P-0Y1M0DT0H0M0S', 28);
+
+echo "test_bug_49081_negative__32: ";
+examine_diff('2010-02-26', '2010-03-27', 'P-0Y1M1DT0H0M0S', 29);
+
+?>
+--EXPECT--
+test_bug_49081__1: FWD: 2010-03-31 00:00:00 EDT - 2010-03-01 00:00:00 EST = **P+0Y0M30DT0H0M0S** | BACK: 2010-03-01 00:00:00 EST + P+0Y0M30DT0H0M0S = **2010-03-31 00:00:00 EDT** | DAYS: **30**
+test_bug_49081__2: FWD: 2010-04-01 00:00:00 EDT - 2010-03-01 00:00:00 EST = **P+0Y1M0DT0H0M0S** | BACK: 2010-03-01 00:00:00 EST + P+0Y1M0DT0H0M0S = **2010-04-01 00:00:00 EDT** | DAYS: **31**
+test_bug_49081__3: FWD: 2010-04-01 00:00:00 EDT - 2010-03-31 00:00:00 EDT = **P+0Y0M1DT0H0M0S** | BACK: 2010-03-31 00:00:00 EDT + P+0Y0M1DT0H0M0S = **2010-04-01 00:00:00 EDT** | DAYS: **1**
+test_bug_49081__4: FWD: 2010-04-29 00:00:00 EDT - 2010-03-31 00:00:00 EDT = **P+0Y0M29DT0H0M0S** | BACK: 2010-03-31 00:00:00 EDT + P+0Y0M29DT0H0M0S = **2010-04-29 00:00:00 EDT** | DAYS: **29**
+test_bug_49081__5: FWD: 2010-04-30 00:00:00 EDT - 2010-03-31 00:00:00 EDT = **P+0Y0M30DT0H0M0S** | BACK: 2010-03-31 00:00:00 EDT + P+0Y0M30DT0H0M0S = **2010-04-30 00:00:00 EDT** | DAYS: **30**
+test_bug_49081__6: FWD: 2010-04-30 00:00:00 EDT - 2010-03-30 00:00:00 EDT = **P+0Y1M0DT0H0M0S** | BACK: 2010-03-30 00:00:00 EDT + P+0Y1M0DT0H0M0S = **2010-04-30 00:00:00 EDT** | DAYS: **31**
+test_bug_49081__7: FWD: 2010-04-30 00:00:00 EDT - 2010-03-29 00:00:00 EDT = **P+0Y1M1DT0H0M0S** | BACK: 2010-03-29 00:00:00 EDT + P+0Y1M1DT0H0M0S = **2010-04-30 00:00:00 EDT** | DAYS: **32**
+test_bug_49081__8: FWD: 2010-01-29 00:00:00 EST - 2010-01-01 00:00:00 EST = **P+0Y0M28DT0H0M0S** | BACK: 2010-01-01 00:00:00 EST + P+0Y0M28DT0H0M0S = **2010-01-29 00:00:00 EST** | DAYS: **28**
+test_bug_49081__9: FWD: 2010-01-30 00:00:00 EST - 2010-01-01 00:00:00 EST = **P+0Y0M29DT0H0M0S** | BACK: 2010-01-01 00:00:00 EST + P+0Y0M29DT0H0M0S = **2010-01-30 00:00:00 EST** | DAYS: **29**
+test_bug_49081__10: FWD: 2010-01-31 00:00:00 EST - 2010-01-01 00:00:00 EST = **P+0Y0M30DT0H0M0S** | BACK: 2010-01-01 00:00:00 EST + P+0Y0M30DT0H0M0S = **2010-01-31 00:00:00 EST** | DAYS: **30**
+test_bug_49081__11: FWD: 2010-02-01 00:00:00 EST - 2010-01-01 00:00:00 EST = **P+0Y1M0DT0H0M0S** | BACK: 2010-01-01 00:00:00 EST + P+0Y1M0DT0H0M0S = **2010-02-01 00:00:00 EST** | DAYS: **31**
+test_bug_49081__12: FWD: 2010-02-01 00:00:00 EST - 2010-01-31 00:00:00 EST = **P+0Y0M1DT0H0M0S** | BACK: 2010-01-31 00:00:00 EST + P+0Y0M1DT0H0M0S = **2010-02-01 00:00:00 EST** | DAYS: **1**
+test_bug_49081__13: FWD: 2010-02-27 00:00:00 EST - 2010-01-31 00:00:00 EST = **P+0Y0M27DT0H0M0S** | BACK: 2010-01-31 00:00:00 EST + P+0Y0M27DT0H0M0S = **2010-02-27 00:00:00 EST** | DAYS: **27**
+test_bug_49081__14: FWD: 2010-02-28 00:00:00 EST - 2010-01-31 00:00:00 EST = **P+0Y0M28DT0H0M0S** | BACK: 2010-01-31 00:00:00 EST + P+0Y0M28DT0H0M0S = **2010-02-28 00:00:00 EST** | DAYS: **28**
+test_bug_49081__15: FWD: 2010-02-28 00:00:00 EST - 2010-01-30 00:00:00 EST = **P+0Y0M29DT0H0M0S** | BACK: 2010-01-30 00:00:00 EST + P+0Y0M29DT0H0M0S = **2010-02-28 00:00:00 EST** | DAYS: **29**
+test_bug_49081__16: FWD: 2010-02-28 00:00:00 EST - 2010-01-29 00:00:00 EST = **P+0Y0M30DT0H0M0S** | BACK: 2010-01-29 00:00:00 EST + P+0Y0M30DT0H0M0S = **2010-02-28 00:00:00 EST** | DAYS: **30**
+test_bug_49081__17: FWD: 2010-02-28 00:00:00 EST - 2010-01-28 00:00:00 EST = **P+0Y1M0DT0H0M0S** | BACK: 2010-01-28 00:00:00 EST + P+0Y1M0DT0H0M0S = **2010-02-28 00:00:00 EST** | DAYS: **31**
+test_bug_49081__18: FWD: 2010-02-28 00:00:00 EST - 2010-01-27 00:00:00 EST = **P+0Y1M1DT0H0M0S** | BACK: 2010-01-27 00:00:00 EST + P+0Y1M1DT0H0M0S = **2010-02-28 00:00:00 EST** | DAYS: **32**
+test_bug_49081__19: FWD: 2010-03-01 00:00:00 EST - 2010-01-01 00:00:00 EST = **P+0Y2M0DT0H0M0S** | BACK: 2010-01-01 00:00:00 EST + P+0Y2M0DT0H0M0S = **2010-03-01 00:00:00 EST** | DAYS: **59**
+test_bug_49081__20: FWD: 2010-03-01 00:00:00 EST - 2010-01-31 00:00:00 EST = **P+0Y0M29DT0H0M0S** | BACK: 2010-01-31 00:00:00 EST + P+0Y0M29DT0H0M0S = **2010-03-01 00:00:00 EST** | DAYS: **29**
+test_bug_49081__21: FWD: 2010-03-27 00:00:00 EDT - 2010-01-31 00:00:00 EST = **P+0Y1M24DT0H0M0S** | BACK: 2010-01-31 00:00:00 EST + P+0Y1M24DT0H0M0S = **2010-03-27 00:00:00 EDT** | DAYS: **55**
+test_bug_49081__22: FWD: 2010-03-28 00:00:00 EDT - 2010-01-31 00:00:00 EST = **P+0Y1M25DT0H0M0S** | BACK: 2010-01-31 00:00:00 EST + P+0Y1M25DT0H0M0S = **2010-03-28 00:00:00 EDT** | DAYS: **56**
+test_bug_49081__23: FWD: 2010-03-29 00:00:00 EDT - 2010-01-31 00:00:00 EST = **P+0Y1M26DT0H0M0S** | BACK: 2010-01-31 00:00:00 EST + P+0Y1M26DT0H0M0S = **2010-03-29 00:00:00 EDT** | DAYS: **57**
+test_bug_49081__24: FWD: 2010-03-30 00:00:00 EDT - 2010-01-31 00:00:00 EST = **P+0Y1M27DT0H0M0S** | BACK: 2010-01-31 00:00:00 EST + P+0Y1M27DT0H0M0S = **2010-03-30 00:00:00 EDT** | DAYS: **58**
+test_bug_49081__25: FWD: 2010-03-31 00:00:00 EDT - 2010-01-31 00:00:00 EST = **P+0Y2M0DT0H0M0S** | BACK: 2010-01-31 00:00:00 EST + P+0Y2M0DT0H0M0S = **2010-03-31 00:00:00 EDT** | DAYS: **59**
+test_bug_49081__26: FWD: 2010-03-31 00:00:00 EDT - 2010-01-30 00:00:00 EST = **P+0Y2M1DT0H0M0S** | BACK: 2010-01-30 00:00:00 EST + P+0Y2M1DT0H0M0S = **2010-03-31 00:00:00 EDT** | DAYS: **60**
+test_bug_49081__27: FWD: 2009-01-31 00:00:00 EST - 2009-01-01 00:00:00 EST = **P+0Y0M30DT0H0M0S** | BACK: 2009-01-01 00:00:00 EST + P+0Y0M30DT0H0M0S = **2009-01-31 00:00:00 EST** | DAYS: **30**
+test_bug_49081__28: FWD: 2010-03-27 00:00:00 EDT - 2010-02-28 00:00:00 EST = **P+0Y0M27DT0H0M0S** | BACK: 2010-02-28 00:00:00 EST + P+0Y0M27DT0H0M0S = **2010-03-27 00:00:00 EDT** | DAYS: **27**
+test_bug_49081__29: FWD: 2010-03-28 00:00:00 EDT - 2010-02-28 00:00:00 EST = **P+0Y1M0DT0H0M0S** | BACK: 2010-02-28 00:00:00 EST + P+0Y1M0DT0H0M0S = **2010-03-28 00:00:00 EDT** | DAYS: **28**
+test_bug_49081__30: FWD: 2010-03-29 00:00:00 EDT - 2010-02-28 00:00:00 EST = **P+0Y1M1DT0H0M0S** | BACK: 2010-02-28 00:00:00 EST + P+0Y1M1DT0H0M0S = **2010-03-29 00:00:00 EDT** | DAYS: **29**
+test_bug_49081__31: FWD: 2010-03-27 00:00:00 EDT - 2010-02-27 00:00:00 EST = **P+0Y1M0DT0H0M0S** | BACK: 2010-02-27 00:00:00 EST + P+0Y1M0DT0H0M0S = **2010-03-27 00:00:00 EDT** | DAYS: **28**
+test_bug_49081__32: FWD: 2010-03-27 00:00:00 EDT - 2010-02-26 00:00:00 EST = **P+0Y1M1DT0H0M0S** | BACK: 2010-02-26 00:00:00 EST + P+0Y1M1DT0H0M0S = **2010-03-27 00:00:00 EDT** | DAYS: **29**
+test_bug_49081_negative__1: FWD: 2010-03-01 00:00:00 EST - 2010-03-31 00:00:00 EDT = **P-0Y0M30DT0H0M0S** | BACK: 2010-03-31 00:00:00 EDT + P-0Y0M30DT0H0M0S = **2010-03-01 00:00:00 EST** | DAYS: **30**
+test_bug_49081_negative__2: FWD: 2010-03-01 00:00:00 EST - 2010-04-01 00:00:00 EDT = **P-0Y1M0DT0H0M0S** | BACK: 2010-04-01 00:00:00 EDT + P-0Y1M0DT0H0M0S = **2010-03-01 00:00:00 EST** | DAYS: **31**
+test_bug_49081_negative__3: FWD: 2010-03-31 00:00:00 EDT - 2010-04-01 00:00:00 EDT = **P-0Y0M1DT0H0M0S** | BACK: 2010-04-01 00:00:00 EDT + P-0Y0M1DT0H0M0S = **2010-03-31 00:00:00 EDT** | DAYS: **1**
+test_bug_49081_negative__4: FWD: 2010-03-31 00:00:00 EDT - 2010-04-29 00:00:00 EDT = **P-0Y0M29DT0H0M0S** | BACK: 2010-04-29 00:00:00 EDT + P-0Y0M29DT0H0M0S = **2010-03-31 00:00:00 EDT** | DAYS: **29**
+test_bug_49081_negative__5: FWD: 2010-03-31 00:00:00 EDT - 2010-04-30 00:00:00 EDT = **P-0Y0M30DT0H0M0S** | BACK: 2010-04-30 00:00:00 EDT + P-0Y0M30DT0H0M0S = **2010-03-31 00:00:00 EDT** | DAYS: **30**
+test_bug_49081_negative__6: FWD: 2010-03-30 00:00:00 EDT - 2010-04-30 00:00:00 EDT = **P-0Y1M0DT0H0M0S** | BACK: 2010-04-30 00:00:00 EDT + P-0Y1M0DT0H0M0S = **2010-03-30 00:00:00 EDT** | DAYS: **31**
+test_bug_49081_negative__7: FWD: 2010-03-29 00:00:00 EDT - 2010-04-30 00:00:00 EDT = **P-0Y1M1DT0H0M0S** | BACK: 2010-04-30 00:00:00 EDT + P-0Y1M1DT0H0M0S = **2010-03-29 00:00:00 EDT** | DAYS: **32**
+test_bug_49081_negative__8: FWD: 2010-01-01 00:00:00 EST - 2010-01-29 00:00:00 EST = **P-0Y0M28DT0H0M0S** | BACK: 2010-01-29 00:00:00 EST + P-0Y0M28DT0H0M0S = **2010-01-01 00:00:00 EST** | DAYS: **28**
+test_bug_49081_negative__9: FWD: 2010-01-01 00:00:00 EST - 2010-01-30 00:00:00 EST = **P-0Y0M29DT0H0M0S** | BACK: 2010-01-30 00:00:00 EST + P-0Y0M29DT0H0M0S = **2010-01-01 00:00:00 EST** | DAYS: **29**
+test_bug_49081_negative__10: FWD: 2010-01-01 00:00:00 EST - 2010-01-31 00:00:00 EST = **P-0Y0M30DT0H0M0S** | BACK: 2010-01-31 00:00:00 EST + P-0Y0M30DT0H0M0S = **2010-01-01 00:00:00 EST** | DAYS: **30**
+test_bug_49081_negative__11: FWD: 2010-01-01 00:00:00 EST - 2010-02-01 00:00:00 EST = **P-0Y1M0DT0H0M0S** | BACK: 2010-02-01 00:00:00 EST + P-0Y1M0DT0H0M0S = **2010-01-01 00:00:00 EST** | DAYS: **31**
+test_bug_49081_negative__12: FWD: 2010-01-31 00:00:00 EST - 2010-02-01 00:00:00 EST = **P-0Y0M1DT0H0M0S** | BACK: 2010-02-01 00:00:00 EST + P-0Y0M1DT0H0M0S = **2010-01-31 00:00:00 EST** | DAYS: **1**
+test_bug_49081_negative__13: FWD: 2010-01-31 00:00:00 EST - 2010-02-27 00:00:00 EST = **P-0Y0M27DT0H0M0S** | BACK: 2010-02-27 00:00:00 EST + P-0Y0M27DT0H0M0S = **2010-01-31 00:00:00 EST** | DAYS: **27**
+test_bug_49081_negative__14: FWD: 2010-01-31 00:00:00 EST - 2010-02-28 00:00:00 EST = **P-0Y0M28DT0H0M0S** | BACK: 2010-02-28 00:00:00 EST + P-0Y0M28DT0H0M0S = **2010-01-31 00:00:00 EST** | DAYS: **28**
+test_bug_49081_negative__15: FWD: 2010-01-30 00:00:00 EST - 2010-02-28 00:00:00 EST = **P-0Y0M29DT0H0M0S** | BACK: 2010-02-28 00:00:00 EST + P-0Y0M29DT0H0M0S = **2010-01-30 00:00:00 EST** | DAYS: **29**
+test_bug_49081_negative__16: FWD: 2010-01-29 00:00:00 EST - 2010-02-28 00:00:00 EST = **P-0Y0M30DT0H0M0S** | BACK: 2010-02-28 00:00:00 EST + P-0Y0M30DT0H0M0S = **2010-01-29 00:00:00 EST** | DAYS: **30**
+test_bug_49081_negative__17: FWD: 2010-01-28 00:00:00 EST - 2010-02-28 00:00:00 EST = **P-0Y1M0DT0H0M0S** | BACK: 2010-02-28 00:00:00 EST + P-0Y1M0DT0H0M0S = **2010-01-28 00:00:00 EST** | DAYS: **31**
+test_bug_49081_negative__18: FWD: 2010-01-27 00:00:00 EST - 2010-02-28 00:00:00 EST = **P-0Y1M1DT0H0M0S** | BACK: 2010-02-28 00:00:00 EST + P-0Y1M1DT0H0M0S = **2010-01-27 00:00:00 EST** | DAYS: **32**
+test_bug_49081_negative__19: FWD: 2010-01-01 00:00:00 EST - 2010-03-01 00:00:00 EST = **P-0Y2M0DT0H0M0S** | BACK: 2010-03-01 00:00:00 EST + P-0Y2M0DT0H0M0S = **2010-01-01 00:00:00 EST** | DAYS: **59**
+test_bug_49081_negative__20: FWD: 2010-01-31 00:00:00 EST - 2010-03-01 00:00:00 EST = **P-0Y1M1DT0H0M0S** | BACK: 2010-03-01 00:00:00 EST + P-0Y1M1DT0H0M0S = **2010-01-31 00:00:00 EST** | DAYS: **29**
+test_bug_49081_negative__21: FWD: 2010-01-31 00:00:00 EST - 2010-03-27 00:00:00 EDT = **P-0Y1M27DT0H0M0S** | BACK: 2010-03-27 00:00:00 EDT + P-0Y1M27DT0H0M0S = **2010-01-31 00:00:00 EST** | DAYS: **55**
+test_bug_49081_negative__22: FWD: 2010-01-31 00:00:00 EST - 2010-03-28 00:00:00 EDT = **P-0Y1M28DT0H0M0S** | BACK: 2010-03-28 00:00:00 EDT + P-0Y1M28DT0H0M0S = **2010-01-31 00:00:00 EST** | DAYS: **56**
+test_bug_49081_negative__23: FWD: 2010-01-31 00:00:00 EST - 2010-03-29 00:00:00 EDT = **P-0Y1M29DT0H0M0S** | BACK: 2010-03-29 00:00:00 EDT + P-0Y1M29DT0H0M0S = **2010-01-31 00:00:00 EST** | DAYS: **57**
+test_bug_49081_negative__24: FWD: 2010-01-31 00:00:00 EST - 2010-03-30 00:00:00 EDT = **P-0Y1M30DT0H0M0S** | BACK: 2010-03-30 00:00:00 EDT + P-0Y1M30DT0H0M0S = **2010-01-31 00:00:00 EST** | DAYS: **58**
+test_bug_49081_negative__25: FWD: 2010-01-31 00:00:00 EST - 2010-03-31 00:00:00 EDT = **P-0Y2M0DT0H0M0S** | BACK: 2010-03-31 00:00:00 EDT + P-0Y2M0DT0H0M0S = **2010-01-31 00:00:00 EST** | DAYS: **59**
+test_bug_49081_negative__26: FWD: 2010-01-30 00:00:00 EST - 2010-03-31 00:00:00 EDT = **P-0Y2M1DT0H0M0S** | BACK: 2010-03-31 00:00:00 EDT + P-0Y2M1DT0H0M0S = **2010-01-30 00:00:00 EST** | DAYS: **60**
+test_bug_49081_negative__27: FWD: 2009-01-01 00:00:00 EST - 2009-01-31 00:00:00 EST = **P-0Y0M30DT0H0M0S** | BACK: 2009-01-31 00:00:00 EST + P-0Y0M30DT0H0M0S = **2009-01-01 00:00:00 EST** | DAYS: **30**
+test_bug_49081_negative__28: FWD: 2010-02-28 00:00:00 EST - 2010-03-27 00:00:00 EDT = **P-0Y0M27DT0H0M0S** | BACK: 2010-03-27 00:00:00 EDT + P-0Y0M27DT0H0M0S = **2010-02-28 00:00:00 EST** | DAYS: **27**
+test_bug_49081_negative__29: FWD: 2010-02-28 00:00:00 EST - 2010-03-28 00:00:00 EDT = **P-0Y1M0DT0H0M0S** | BACK: 2010-03-28 00:00:00 EDT + P-0Y1M0DT0H0M0S = **2010-02-28 00:00:00 EST** | DAYS: **28**
+test_bug_49081_negative__30: FWD: 2010-02-28 00:00:00 EST - 2010-03-29 00:00:00 EDT = **P-0Y1M1DT0H0M0S** | BACK: 2010-03-29 00:00:00 EDT + P-0Y1M1DT0H0M0S = **2010-02-28 00:00:00 EST** | DAYS: **29**
+test_bug_49081_negative__31: FWD: 2010-02-27 00:00:00 EST - 2010-03-27 00:00:00 EDT = **P-0Y1M0DT0H0M0S** | BACK: 2010-03-27 00:00:00 EDT + P-0Y1M0DT0H0M0S = **2010-02-27 00:00:00 EST** | DAYS: **28**
+test_bug_49081_negative__32: FWD: 2010-02-26 00:00:00 EST - 2010-03-27 00:00:00 EDT = **P-0Y1M1DT0H0M0S** | BACK: 2010-03-27 00:00:00 EDT + P-0Y1M1DT0H0M0S = **2010-02-26 00:00:00 EST** | DAYS: **29**
diff --git a/ext/date/tests/DateTime_diff_add_sub-massive.phpt b/ext/date/tests/DateTime_diff_add_sub-massive.phpt
new file mode 100644 (file)
index 0000000..d9f48a0
--- /dev/null
@@ -0,0 +1,45 @@
+--TEST--
+DateTime::diff() add() sub() -- massive
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Massive dates
+ */
+echo "test_massive_positive: ";
+$end = new DateTime;
+$end->setDate(333333, 1, 1);
+$end->setTime(16, 18, 02);
+
+$start = new DateTime;
+$start->setDate(-333333, 1, 1);
+$start->setTime(16, 18, 02);
+
+examine_diff($end, $start, 'P+666666Y0M0DT0H0M0S', 243494757);
+
+echo "test_massive_negative: ";
+$end = new DateTime;
+$end->setDate(-333333, 1, 1);
+$end->setTime(16, 18, 02);
+
+$start = new DateTime;
+$start->setDate(333333, 1, 1);
+$start->setTime(16, 18, 02);
+
+examine_diff($end, $start, 'P-666666Y0M0DT0H0M0S', 243494757);
+
+?>
+--EXPECT--
+test_massive_positive: FWD: 333333-01-01 16:18:02 EST - -333333-01-01 16:18:02 EST = **P+666666Y0M0DT0H0M0S** | BACK: -333333-01-01 16:18:02 EST + P+666666Y0M0DT0H0M0S = **333333-01-01 16:18:02 EST** | DAYS: **243494757**
+test_massive_negative: FWD: -333333-01-01 16:18:02 EST - 333333-01-01 16:18:02 EST = **P-666666Y0M0DT0H0M0S** | BACK: 333333-01-01 16:18:02 EST + P-666666Y0M0DT0H0M0S = **-333333-01-01 16:18:02 EST** | DAYS: **243494757**
diff --git a/ext/date/tests/DateTime_diff_add_sub-spring-type2-type2.phpt b/ext/date/tests/DateTime_diff_add_sub-spring-type2-type2.phpt
new file mode 100644 (file)
index 0000000..2ed280e
--- /dev/null
@@ -0,0 +1,124 @@
+--TEST--
+DateTime::diff() add() sub() -- spring type2 type2
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--XFAIL--
+PHP < 5.4 has bugs
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Time, Spring, Zone Type 2 to Zone Type 2
+ *
+ * + prev: the day before the transition day  2010-03-13 18:38:28 EST
+ * + st: standard time on transition day      2010-03-14 00:10:20 EST
+ * + dt: daylight time on the transition day  2010-03-14 03:16:55 EDT
+ * + post: the day after the transition day   2010-03-15 19:59:59 EDT
+ */
+echo "test_time_spring_type2_prev_type2_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+$start = new DateTime('2010-02-11 02:18:48 EST');  // sp prev, zt2
+examine_diff($end, $start, 'P+0Y1M2DT16H19M40S', 30);
+
+echo "test_time_spring_type2_prev_type2_st: ";
+$end   = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+$start = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT5H31M52S', 0);
+
+echo "test_time_spring_type2_prev_type2_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+$start = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT7H38M27S', 0);
+
+echo "test_time_spring_type2_prev_type2_post: ";
+$end   = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+$start = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M2DT1H21M31S', 2);
+
+echo "test_time_spring_type2_st_type2_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+$start = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+examine_diff($end, $start, 'P-0Y0M0DT5H31M52S', 0);
+
+echo "test_time_spring_type2_st_type2_st: ";
+$end   = new DateTime('2010-03-14 00:15:35 EST');  // sp st, zt2
+$start = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+examine_diff($end, $start, 'P+0Y0M0DT0H5M15S', 0);
+
+echo "test_time_spring_type2_st_type2_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+$start = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+examine_diff($end, $start, 'P+0Y0M0DT2H6M35S', 0);
+
+echo "test_time_spring_type2_st_type2_post: ";
+$end   = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+$start = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+examine_diff($end, $start, 'P+0Y0M1DT18H49M39S', 1);
+
+echo "test_time_spring_type2_dt_type2_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+$start = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+examine_diff($end, $start, 'P-0Y0M0DT7H38M27S', 0);
+
+echo "test_time_spring_type2_dt_type2_st: ";
+$end   = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+$start = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+examine_diff($end, $start, 'P-0Y0M0DT2H6M35S', 0);
+
+echo "test_time_spring_type2_dt_type2_dt: ";
+$end   = new DateTime('2010-03-14 05:19:56 EDT');  // sp dt, zt2
+$start = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT2H3M1S', 0);
+
+echo "test_time_spring_type2_dt_type2_post: ";
+$end   = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+$start = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M1DT16H43M4S', 1);
+
+echo "test_time_spring_type2_post_type2_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+$start = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M2DT1H21M31S', 2);
+
+echo "test_time_spring_type2_post_type2_st: ";
+$end   = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+$start = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT18H49M39S', 1);
+
+echo "test_time_spring_type2_post_type2_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+$start = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT16H43M4S', 1);
+
+echo "test_time_spring_type2_post_type2_post: ";
+$end   = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+$start = new DateTime('2010-03-15 18:57:55 EDT');  // sp post, zt2
+examine_diff($end, $start, 'P+0Y0M0DT1H2M4S', 0);
+
+?>
+--EXPECT--
+test_time_spring_type2_prev_type2_prev: FWD: 2010-03-13 18:38:28 EST - 2010-02-11 02:18:48 EST = **P+0Y1M2DT16H19M40S** | BACK: 2010-02-11 02:18:48 EST + P+0Y1M2DT16H19M40S = **2010-03-13 18:38:28 EST** | DAYS: **30**
+test_time_spring_type2_prev_type2_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-13 18:38:28 EST = **P+0Y0M0DT5H31M52S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M0DT5H31M52S = **2010-03-14 00:10:20 EST** | DAYS: **0**
+test_time_spring_type2_prev_type2_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-13 18:38:28 EST = **P+0Y0M0DT7H38M27S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M0DT7H38M27S = **2010-03-14 03:16:55 EDT** | DAYS: **0**
+test_time_spring_type2_prev_type2_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-13 18:38:28 EST = **P+0Y0M2DT1H21M31S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M2DT1H21M31S = **2010-03-15 19:59:59 EDT** | DAYS: **2**
+test_time_spring_type2_st_type2_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-14 00:10:20 EST = **P-0Y0M0DT5H31M52S** | BACK: 2010-03-14 00:10:20 EST + P-0Y0M0DT5H31M52S = **2010-03-13 18:38:28 EST** | DAYS: **0**
+test_time_spring_type2_st_type2_st: FWD: 2010-03-14 00:15:35 EST - 2010-03-14 00:10:20 EST = **P+0Y0M0DT0H5M15S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M0DT0H5M15S = **2010-03-14 00:15:35 EST** | DAYS: **0**
+test_time_spring_type2_st_type2_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-14 00:10:20 EST = **P+0Y0M0DT2H6M35S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M0DT2H6M35S = **2010-03-14 03:16:55 EDT** | DAYS: **0**
+test_time_spring_type2_st_type2_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-14 00:10:20 EST = **P+0Y0M1DT18H49M39S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M1DT18H49M39S = **2010-03-15 19:59:59 EDT** | DAYS: **1**
+test_time_spring_type2_dt_type2_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-14 03:16:55 EDT = **P-0Y0M0DT7H38M27S** | BACK: 2010-03-14 03:16:55 EDT + P-0Y0M0DT7H38M27S = **2010-03-13 18:38:28 EST** | DAYS: **0**
+test_time_spring_type2_dt_type2_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-14 03:16:55 EDT = **P-0Y0M0DT2H6M35S** | BACK: 2010-03-14 03:16:55 EDT + P-0Y0M0DT2H6M35S = **2010-03-14 00:10:20 EST** | DAYS: **0**
+test_time_spring_type2_dt_type2_dt: FWD: 2010-03-14 05:19:56 EDT - 2010-03-14 03:16:55 EDT = **P+0Y0M0DT2H3M1S** | BACK: 2010-03-14 03:16:55 EDT + P+0Y0M0DT2H3M1S = **2010-03-14 05:19:56 EDT** | DAYS: **0**
+test_time_spring_type2_dt_type2_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-14 03:16:55 EDT = **P+0Y0M1DT16H43M4S** | BACK: 2010-03-14 03:16:55 EDT + P+0Y0M1DT16H43M4S = **2010-03-15 19:59:59 EDT** | DAYS: **1**
+test_time_spring_type2_post_type2_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-15 19:59:59 EDT = **P-0Y0M2DT1H21M31S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M2DT1H21M31S = **2010-03-13 18:38:28 EST** | DAYS: **2**
+test_time_spring_type2_post_type2_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-15 19:59:59 EDT = **P-0Y0M1DT18H49M39S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M1DT18H49M39S = **2010-03-14 00:10:20 EST** | DAYS: **1**
+test_time_spring_type2_post_type2_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-15 19:59:59 EDT = **P-0Y0M1DT16H43M4S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M1DT16H43M4S = **2010-03-14 03:16:55 EDT** | DAYS: **1**
+test_time_spring_type2_post_type2_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-15 18:57:55 EDT = **P+0Y0M0DT1H2M4S** | BACK: 2010-03-15 18:57:55 EDT + P+0Y0M0DT1H2M4S = **2010-03-15 19:59:59 EDT** | DAYS: **0**
diff --git a/ext/date/tests/DateTime_diff_add_sub-spring-type2-type3.phpt b/ext/date/tests/DateTime_diff_add_sub-spring-type2-type3.phpt
new file mode 100644 (file)
index 0000000..d36dcc9
--- /dev/null
@@ -0,0 +1,124 @@
+--TEST--
+DateTime::diff() add() sub() -- spring type2 type3
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--XFAIL--
+PHP < 5.4 has bugs
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Time, Spring, Zone Type 2 to Zone Type 3
+ *
+ * + prev: the day before the transition day  2010-03-13 18:38:28 EST
+ * + st: standard time on transition day      2010-03-14 00:10:20 EST
+ * + dt: daylight time on the transition day  2010-03-14 03:16:55 EDT
+ * + post: the day after the transition day   2010-03-15 19:59:59 EDT
+ */
+echo "test_time_spring_type2_prev_type3_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+$start = new DateTime('2010-02-11 02:18:48 EST');  // sp prev, zt2
+examine_diff($end, $start, 'P+0Y1M2DT16H19M40S', 30);
+
+echo "test_time_spring_type2_prev_type3_st: ";
+$end   = new DateTime('2010-03-14 00:10:20');  // st, zt3
+$start = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT5H31M52S', 0);
+
+echo "test_time_spring_type2_prev_type3_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+$start = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M0DT7H38M27S', 0);
+
+echo "test_time_spring_type2_prev_type3_post: ";
+$end   = new DateTime('2010-03-15 19:59:59');  // post, zt3
+$start = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+examine_diff($end, $start, 'P+0Y0M2DT1H21M31S', 2);
+
+echo "test_time_spring_type2_st_type3_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+$start = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+examine_diff($end, $start, 'P-0Y0M0DT5H31M52S', 0);
+
+echo "test_time_spring_type2_st_type3_st: ";
+$end   = new DateTime('2010-03-14 00:15:35');  // sp st, zt3
+$start = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+examine_diff($end, $start, 'P+0Y0M0DT0H5M15S', 0);
+
+echo "test_time_spring_type2_st_type3_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+$start = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+examine_diff($end, $start, 'P+0Y0M0DT2H6M35S', 0);
+
+echo "test_time_spring_type2_st_type3_post: ";
+$end   = new DateTime('2010-03-15 19:59:59');  // post, zt3
+$start = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+examine_diff($end, $start, 'P+0Y0M1DT18H49M39S', 1);
+
+echo "test_time_spring_type2_dt_type3_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+$start = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+examine_diff($end, $start, 'P-0Y0M0DT7H38M27S', 0);
+
+echo "test_time_spring_type2_dt_type3_st: ";
+$end   = new DateTime('2010-03-14 00:10:20');  // st, zt3
+$start = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+examine_diff($end, $start, 'P-0Y0M0DT2H6M35S', 0);
+
+echo "test_time_spring_type2_dt_type3_dt: ";
+$end   = new DateTime('2010-03-14 05:19:56');  // sp dt, zt3
+$start = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M0DT2H3M1S', 0);
+
+echo "test_time_spring_type2_dt_type3_post: ";
+$end   = new DateTime('2010-03-15 19:59:59');  // post, zt3
+$start = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+examine_diff($end, $start, 'P+0Y0M1DT16H43M4S', 1);
+
+echo "test_time_spring_type2_post_type3_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+$start = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M2DT1H21M31S', 2);
+
+echo "test_time_spring_type2_post_type3_st: ";
+$end   = new DateTime('2010-03-14 00:10:20');  // st, zt3
+$start = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT18H49M39S', 1);
+
+echo "test_time_spring_type2_post_type3_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+$start = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+examine_diff($end, $start, 'P-0Y0M1DT16H43M4S', 1);
+
+echo "test_time_spring_type2_post_type3_post: ";
+$end   = new DateTime('2010-03-15 19:59:59');  // post, zt3
+$start = new DateTime('2010-03-15 18:57:55 EDT');  // sp post, zt2
+examine_diff($end, $start, 'P+0Y0M0DT1H2M4S', 0);
+
+?>
+--EXPECT--
+test_time_spring_type2_prev_type3_prev: FWD: 2010-03-13 18:38:28 EST - 2010-02-11 02:18:48 EST = **P+0Y1M2DT16H19M40S** | BACK: 2010-02-11 02:18:48 EST + P+0Y1M2DT16H19M40S = **2010-03-13 18:38:28 EST** | DAYS: **30**
+test_time_spring_type2_prev_type3_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-13 18:38:28 EST = **P+0Y0M0DT5H31M52S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M0DT5H31M52S = **2010-03-14 00:10:20 EST** | DAYS: **0**
+test_time_spring_type2_prev_type3_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-13 18:38:28 EST = **P+0Y0M0DT7H38M27S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M0DT7H38M27S = **2010-03-14 03:16:55 EDT** | DAYS: **0**
+test_time_spring_type2_prev_type3_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-13 18:38:28 EST = **P+0Y0M2DT1H21M31S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M2DT1H21M31S = **2010-03-15 19:59:59 EDT** | DAYS: **2**
+test_time_spring_type2_st_type3_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-14 00:10:20 EST = **P-0Y0M0DT5H31M52S** | BACK: 2010-03-14 00:10:20 EST + P-0Y0M0DT5H31M52S = **2010-03-13 18:38:28 EST** | DAYS: **0**
+test_time_spring_type2_st_type3_st: FWD: 2010-03-14 00:15:35 EST - 2010-03-14 00:10:20 EST = **P+0Y0M0DT0H5M15S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M0DT0H5M15S = **2010-03-14 00:15:35 EST** | DAYS: **0**
+test_time_spring_type2_st_type3_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-14 00:10:20 EST = **P+0Y0M0DT2H6M35S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M0DT2H6M35S = **2010-03-14 03:16:55 EDT** | DAYS: **0**
+test_time_spring_type2_st_type3_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-14 00:10:20 EST = **P+0Y0M1DT18H49M39S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M1DT18H49M39S = **2010-03-15 19:59:59 EDT** | DAYS: **1**
+test_time_spring_type2_dt_type3_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-14 03:16:55 EDT = **P-0Y0M0DT7H38M27S** | BACK: 2010-03-14 03:16:55 EDT + P-0Y0M0DT7H38M27S = **2010-03-13 18:38:28 EST** | DAYS: **0**
+test_time_spring_type2_dt_type3_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-14 03:16:55 EDT = **P-0Y0M0DT2H6M35S** | BACK: 2010-03-14 03:16:55 EDT + P-0Y0M0DT2H6M35S = **2010-03-14 00:10:20 EST** | DAYS: **0**
+test_time_spring_type2_dt_type3_dt: FWD: 2010-03-14 05:19:56 EDT - 2010-03-14 03:16:55 EDT = **P+0Y0M0DT2H3M1S** | BACK: 2010-03-14 03:16:55 EDT + P+0Y0M0DT2H3M1S = **2010-03-14 05:19:56 EDT** | DAYS: **0**
+test_time_spring_type2_dt_type3_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-14 03:16:55 EDT = **P+0Y0M1DT16H43M4S** | BACK: 2010-03-14 03:16:55 EDT + P+0Y0M1DT16H43M4S = **2010-03-15 19:59:59 EDT** | DAYS: **1**
+test_time_spring_type2_post_type3_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-15 19:59:59 EDT = **P-0Y0M2DT1H21M31S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M2DT1H21M31S = **2010-03-13 18:38:28 EST** | DAYS: **2**
+test_time_spring_type2_post_type3_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-15 19:59:59 EDT = **P-0Y0M1DT18H49M39S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M1DT18H49M39S = **2010-03-14 00:10:20 EST** | DAYS: **1**
+test_time_spring_type2_post_type3_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-15 19:59:59 EDT = **P-0Y0M1DT16H43M4S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M1DT16H43M4S = **2010-03-14 03:16:55 EDT** | DAYS: **1**
+test_time_spring_type2_post_type3_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-15 18:57:55 EDT = **P+0Y0M0DT1H2M4S** | BACK: 2010-03-15 18:57:55 EDT + P+0Y0M0DT1H2M4S = **2010-03-15 19:59:59 EDT** | DAYS: **0**
diff --git a/ext/date/tests/DateTime_diff_add_sub-spring-type3-type2.phpt b/ext/date/tests/DateTime_diff_add_sub-spring-type3-type2.phpt
new file mode 100644 (file)
index 0000000..cf0e6a5
--- /dev/null
@@ -0,0 +1,124 @@
+--TEST--
+DateTime::diff() add() sub() -- spring type3 type2
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--XFAIL--
+PHP < 5.4 has bugs
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Time, Spring, Zone Type 3 to Zone Type 2
+ *
+ * + prev: the day before the transition day  2010-03-13 18:38:28 EST
+ * + st: standard time on transition day      2010-03-14 00:10:20 EST
+ * + dt: daylight time on the transition day  2010-03-14 03:16:55 EDT
+ * + post: the day after the transition day   2010-03-15 19:59:59 EDT
+ */
+echo "test_time_spring_type3_prev_type2_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+$start = new DateTime('2010-02-11 02:18:48');  // sp prev, zt3
+examine_diff($end, $start, 'P+0Y1M2DT16H19M40S', 30);
+
+echo "test_time_spring_type3_prev_type2_st: ";
+$end   = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+$start = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT5H31M52S', 0);
+
+echo "test_time_spring_type3_prev_type2_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+$start = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT7H38M27S', 0);
+
+echo "test_time_spring_type3_prev_type2_post: ";
+$end   = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+$start = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M2DT1H21M31S', 2);
+
+echo "test_time_spring_type3_st_type2_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+$start = new DateTime('2010-03-14 00:10:20');  // st, zt3
+examine_diff($end, $start, 'P-0Y0M0DT5H31M52S', 0);
+
+echo "test_time_spring_type3_st_type2_st: ";
+$end   = new DateTime('2010-03-14 00:15:35 EST');  // sp st, zt2
+$start = new DateTime('2010-03-14 00:10:20');  // st, zt3
+examine_diff($end, $start, 'P+0Y0M0DT0H5M15S', 0);
+
+echo "test_time_spring_type3_st_type2_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+$start = new DateTime('2010-03-14 00:10:20');  // st, zt3
+examine_diff($end, $start, 'P+0Y0M0DT2H6M35S', 0);
+
+echo "test_time_spring_type3_st_type2_post: ";
+$end   = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+$start = new DateTime('2010-03-14 00:10:20');  // st, zt3
+examine_diff($end, $start, 'P+0Y0M1DT18H49M39S', 1);
+
+echo "test_time_spring_type3_dt_type2_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+$start = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+examine_diff($end, $start, 'P-0Y0M0DT7H38M27S', 0);
+
+echo "test_time_spring_type3_dt_type2_st: ";
+$end   = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+$start = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+examine_diff($end, $start, 'P-0Y0M0DT2H6M35S', 0);
+
+echo "test_time_spring_type3_dt_type2_dt: ";
+$end   = new DateTime('2010-03-14 05:19:56 EDT');  // sp dt, zt2
+$start = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M0DT2H3M1S', 0);
+
+echo "test_time_spring_type3_dt_type2_post: ";
+$end   = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+$start = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M1DT16H43M4S', 1);
+
+echo "test_time_spring_type3_post_type2_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28 EST');  // prev, zt2
+$start = new DateTime('2010-03-15 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M2DT1H21M31S', 2);
+
+echo "test_time_spring_type3_post_type2_st: ";
+$end   = new DateTime('2010-03-14 00:10:20 EST');  // st, zt2
+$start = new DateTime('2010-03-15 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT18H49M39S', 1);
+
+echo "test_time_spring_type3_post_type2_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55 EDT');  // dt, zt2
+$start = new DateTime('2010-03-15 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT16H43M4S', 1);
+
+echo "test_time_spring_type3_post_type2_post: ";
+$end   = new DateTime('2010-03-15 19:59:59 EDT');  // post, zt2
+$start = new DateTime('2010-03-15 18:57:55');  // sp post, zt3
+examine_diff($end, $start, 'P+0Y0M0DT1H2M4S', 0);
+
+?>
+--EXPECT--
+test_time_spring_type3_prev_type2_prev: FWD: 2010-03-13 18:38:28 EST - 2010-02-11 02:18:48 EST = **P+0Y1M2DT16H19M40S** | BACK: 2010-02-11 02:18:48 EST + P+0Y1M2DT16H19M40S = **2010-03-13 18:38:28 EST** | DAYS: **30**
+test_time_spring_type3_prev_type2_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-13 18:38:28 EST = **P+0Y0M0DT5H31M52S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M0DT5H31M52S = **2010-03-14 00:10:20 EST** | DAYS: **0**
+test_time_spring_type3_prev_type2_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-13 18:38:28 EST = **P+0Y0M0DT7H38M27S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M0DT7H38M27S = **2010-03-14 03:16:55 EDT** | DAYS: **0**
+test_time_spring_type3_prev_type2_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-13 18:38:28 EST = **P+0Y0M2DT1H21M31S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M2DT1H21M31S = **2010-03-15 19:59:59 EDT** | DAYS: **2**
+test_time_spring_type3_st_type2_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-14 00:10:20 EST = **P-0Y0M0DT5H31M52S** | BACK: 2010-03-14 00:10:20 EST + P-0Y0M0DT5H31M52S = **2010-03-13 18:38:28 EST** | DAYS: **0**
+test_time_spring_type3_st_type2_st: FWD: 2010-03-14 00:15:35 EST - 2010-03-14 00:10:20 EST = **P+0Y0M0DT0H5M15S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M0DT0H5M15S = **2010-03-14 00:15:35 EST** | DAYS: **0**
+test_time_spring_type3_st_type2_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-14 00:10:20 EST = **P+0Y0M0DT2H6M35S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M0DT2H6M35S = **2010-03-14 03:16:55 EDT** | DAYS: **0**
+test_time_spring_type3_st_type2_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-14 00:10:20 EST = **P+0Y0M1DT18H49M39S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M1DT18H49M39S = **2010-03-15 19:59:59 EDT** | DAYS: **1**
+test_time_spring_type3_dt_type2_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-14 03:16:55 EDT = **P-0Y0M0DT7H38M27S** | BACK: 2010-03-14 03:16:55 EDT + P-0Y0M0DT7H38M27S = **2010-03-13 18:38:28 EST** | DAYS: **0**
+test_time_spring_type3_dt_type2_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-14 03:16:55 EDT = **P-0Y0M0DT2H6M35S** | BACK: 2010-03-14 03:16:55 EDT + P-0Y0M0DT2H6M35S = **2010-03-14 00:10:20 EST** | DAYS: **0**
+test_time_spring_type3_dt_type2_dt: FWD: 2010-03-14 05:19:56 EDT - 2010-03-14 03:16:55 EDT = **P+0Y0M0DT2H3M1S** | BACK: 2010-03-14 03:16:55 EDT + P+0Y0M0DT2H3M1S = **2010-03-14 05:19:56 EDT** | DAYS: **0**
+test_time_spring_type3_dt_type2_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-14 03:16:55 EDT = **P+0Y0M1DT16H43M4S** | BACK: 2010-03-14 03:16:55 EDT + P+0Y0M1DT16H43M4S = **2010-03-15 19:59:59 EDT** | DAYS: **1**
+test_time_spring_type3_post_type2_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-15 19:59:59 EDT = **P-0Y0M2DT1H21M31S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M2DT1H21M31S = **2010-03-13 18:38:28 EST** | DAYS: **2**
+test_time_spring_type3_post_type2_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-15 19:59:59 EDT = **P-0Y0M1DT18H49M39S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M1DT18H49M39S = **2010-03-14 00:10:20 EST** | DAYS: **1**
+test_time_spring_type3_post_type2_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-15 19:59:59 EDT = **P-0Y0M1DT16H43M4S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M1DT16H43M4S = **2010-03-14 03:16:55 EDT** | DAYS: **1**
+test_time_spring_type3_post_type2_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-15 18:57:55 EDT = **P+0Y0M0DT1H2M4S** | BACK: 2010-03-15 18:57:55 EDT + P+0Y0M0DT1H2M4S = **2010-03-15 19:59:59 EDT** | DAYS: **0**
diff --git a/ext/date/tests/DateTime_diff_add_sub-spring-type3-type3.phpt b/ext/date/tests/DateTime_diff_add_sub-spring-type3-type3.phpt
new file mode 100644 (file)
index 0000000..afb8cda
--- /dev/null
@@ -0,0 +1,124 @@
+--TEST--
+DateTime::diff() add() sub() -- spring type3 type3
+--CREDITS--
+Daniel Convissor <danielc@php.net>
+--XFAIL--
+PHP < 5.4 has bugs
+--FILE--
+<?php
+
+/*
+ * Note: test names match method names in a set of PHPUnit tests
+ * in a userland package.  Please be so kind as to leave them.
+ */
+
+require './examine_diff.inc';
+date_default_timezone_set('America/New_York');
+
+
+/*
+ * Time, Spring, Zone Type 3 to Zone Type 3
+ *
+ * + prev: the day before the transition day  2010-03-13 18:38:28
+ * + st: standard time on transition day      2010-03-14 00:10:20
+ * + dt: daylight time on the transition day  2010-03-14 03:16:55
+ * + post: the day after the transition day   2010-03-15 19:59:59
+ */
+echo "test_time_spring_type3_prev_type3_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+$start = new DateTime('2010-02-11 02:18:48');  // sp prev, zt3
+examine_diff($end, $start, 'P+0Y1M2DT16H19M40S', 30);
+
+echo "test_time_spring_type3_prev_type3_st: ";
+$end   = new DateTime('2010-03-14 00:10:20');  // st, zt3
+$start = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT5H31M52S', 0);
+
+echo "test_time_spring_type3_prev_type3_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+$start = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M0DT7H38M27S', 0);
+
+echo "test_time_spring_type3_prev_type3_post: ";
+$end   = new DateTime('2010-03-15 19:59:59');  // post, zt3
+$start = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+examine_diff($end, $start, 'P+0Y0M2DT1H21M31S', 2);
+
+echo "test_time_spring_type3_st_type3_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+$start = new DateTime('2010-03-14 00:10:20');  // st, zt3
+examine_diff($end, $start, 'P-0Y0M0DT5H31M52S', 0);
+
+echo "test_time_spring_type3_st_type3_st: ";
+$end   = new DateTime('2010-03-14 00:15:35');  // sp st, zt3
+$start = new DateTime('2010-03-14 00:10:20');  // st, zt3
+examine_diff($end, $start, 'P+0Y0M0DT0H5M15S', 0);
+
+echo "test_time_spring_type3_st_type3_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+$start = new DateTime('2010-03-14 00:10:20');  // st, zt3
+examine_diff($end, $start, 'P+0Y0M0DT2H6M35S', 0);
+
+echo "test_time_spring_type3_st_type3_post: ";
+$end   = new DateTime('2010-03-15 19:59:59');  // post, zt3
+$start = new DateTime('2010-03-14 00:10:20');  // st, zt3
+examine_diff($end, $start, 'P+0Y0M1DT18H49M39S', 1);
+
+echo "test_time_spring_type3_dt_type3_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+$start = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+examine_diff($end, $start, 'P-0Y0M0DT7H38M27S', 0);
+
+echo "test_time_spring_type3_dt_type3_st: ";
+$end   = new DateTime('2010-03-14 00:10:20');  // st, zt3
+$start = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+examine_diff($end, $start, 'P-0Y0M0DT2H6M35S', 0);
+
+echo "test_time_spring_type3_dt_type3_dt: ";
+$end   = new DateTime('2010-03-14 05:19:56');  // sp dt, zt3
+$start = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M0DT2H3M1S', 0);
+
+echo "test_time_spring_type3_dt_type3_post: ";
+$end   = new DateTime('2010-03-15 19:59:59');  // post, zt3
+$start = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+examine_diff($end, $start, 'P+0Y0M1DT16H43M4S', 1);
+
+echo "test_time_spring_type3_post_type3_prev: ";
+$end   = new DateTime('2010-03-13 18:38:28');  // prev, zt3
+$start = new DateTime('2010-03-15 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M2DT1H21M31S', 2);
+
+echo "test_time_spring_type3_post_type3_st: ";
+$end   = new DateTime('2010-03-14 00:10:20');  // st, zt3
+$start = new DateTime('2010-03-15 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT18H49M39S', 1);
+
+echo "test_time_spring_type3_post_type3_dt: ";
+$end   = new DateTime('2010-03-14 03:16:55');  // dt, zt3
+$start = new DateTime('2010-03-15 19:59:59');  // post, zt3
+examine_diff($end, $start, 'P-0Y0M1DT16H43M4S', 1);
+
+echo "test_time_spring_type3_post_type3_post: ";
+$end   = new DateTime('2010-03-15 19:59:59');  // post, zt3
+$start = new DateTime('2010-03-15 18:57:55');  // sp post, zt3
+examine_diff($end, $start, 'P+0Y0M0DT1H2M4S', 0);
+
+?>
+--EXPECT--
+test_time_spring_type3_prev_type3_prev: FWD: 2010-03-13 18:38:28 EST - 2010-02-11 02:18:48 EST = **P+0Y1M2DT16H19M40S** | BACK: 2010-02-11 02:18:48 EST + P+0Y1M2DT16H19M40S = **2010-03-13 18:38:28 EST** | DAYS: **30**
+test_time_spring_type3_prev_type3_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-13 18:38:28 EST = **P+0Y0M0DT5H31M52S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M0DT5H31M52S = **2010-03-14 00:10:20 EST** | DAYS: **0**
+test_time_spring_type3_prev_type3_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-13 18:38:28 EST = **P+0Y0M0DT7H38M27S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M0DT7H38M27S = **2010-03-14 03:16:55 EDT** | DAYS: **0**
+test_time_spring_type3_prev_type3_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-13 18:38:28 EST = **P+0Y0M2DT1H21M31S** | BACK: 2010-03-13 18:38:28 EST + P+0Y0M2DT1H21M31S = **2010-03-15 19:59:59 EDT** | DAYS: **2**
+test_time_spring_type3_st_type3_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-14 00:10:20 EST = **P-0Y0M0DT5H31M52S** | BACK: 2010-03-14 00:10:20 EST + P-0Y0M0DT5H31M52S = **2010-03-13 18:38:28 EST** | DAYS: **0**
+test_time_spring_type3_st_type3_st: FWD: 2010-03-14 00:15:35 EST - 2010-03-14 00:10:20 EST = **P+0Y0M0DT0H5M15S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M0DT0H5M15S = **2010-03-14 00:15:35 EST** | DAYS: **0**
+test_time_spring_type3_st_type3_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-14 00:10:20 EST = **P+0Y0M0DT2H6M35S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M0DT2H6M35S = **2010-03-14 03:16:55 EDT** | DAYS: **0**
+test_time_spring_type3_st_type3_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-14 00:10:20 EST = **P+0Y0M1DT18H49M39S** | BACK: 2010-03-14 00:10:20 EST + P+0Y0M1DT18H49M39S = **2010-03-15 19:59:59 EDT** | DAYS: **1**
+test_time_spring_type3_dt_type3_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-14 03:16:55 EDT = **P-0Y0M0DT7H38M27S** | BACK: 2010-03-14 03:16:55 EDT + P-0Y0M0DT7H38M27S = **2010-03-13 18:38:28 EST** | DAYS: **0**
+test_time_spring_type3_dt_type3_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-14 03:16:55 EDT = **P-0Y0M0DT2H6M35S** | BACK: 2010-03-14 03:16:55 EDT + P-0Y0M0DT2H6M35S = **2010-03-14 00:10:20 EST** | DAYS: **0**
+test_time_spring_type3_dt_type3_dt: FWD: 2010-03-14 05:19:56 EDT - 2010-03-14 03:16:55 EDT = **P+0Y0M0DT2H3M1S** | BACK: 2010-03-14 03:16:55 EDT + P+0Y0M0DT2H3M1S = **2010-03-14 05:19:56 EDT** | DAYS: **0**
+test_time_spring_type3_dt_type3_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-14 03:16:55 EDT = **P+0Y0M1DT16H43M4S** | BACK: 2010-03-14 03:16:55 EDT + P+0Y0M1DT16H43M4S = **2010-03-15 19:59:59 EDT** | DAYS: **1**
+test_time_spring_type3_post_type3_prev: FWD: 2010-03-13 18:38:28 EST - 2010-03-15 19:59:59 EDT = **P-0Y0M2DT1H21M31S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M2DT1H21M31S = **2010-03-13 18:38:28 EST** | DAYS: **2**
+test_time_spring_type3_post_type3_st: FWD: 2010-03-14 00:10:20 EST - 2010-03-15 19:59:59 EDT = **P-0Y0M1DT18H49M39S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M1DT18H49M39S = **2010-03-14 00:10:20 EST** | DAYS: **1**
+test_time_spring_type3_post_type3_dt: FWD: 2010-03-14 03:16:55 EDT - 2010-03-15 19:59:59 EDT = **P-0Y0M1DT16H43M4S** | BACK: 2010-03-15 19:59:59 EDT + P-0Y0M1DT16H43M4S = **2010-03-14 03:16:55 EDT** | DAYS: **1**
+test_time_spring_type3_post_type3_post: FWD: 2010-03-15 19:59:59 EDT - 2010-03-15 18:57:55 EDT = **P+0Y0M0DT1H2M4S** | BACK: 2010-03-15 18:57:55 EDT + P+0Y0M0DT1H2M4S = **2010-03-15 19:59:59 EDT** | DAYS: **0**
diff --git a/ext/date/tests/examine_diff.inc b/ext/date/tests/examine_diff.inc
new file mode 100644 (file)
index 0000000..35b4ae3
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * Helper for the DateTime_diff_add_sub* tests
+ *
+ * @author Daniel Convissor <danielc@analysisandsolutions.com>
+ */
+
+/**
+ * Provides a consistent interface for executing date diff tests
+ *
+ * Tests the diff() method then passes the resulting
+ * interval to the add()/sub() method as a double check
+ *
+ * @param string|DateTime $end_date  the end date in YYYY-MM-DD format
+ *                        (can include time HH:MM:SS) or a DateTime object
+ * @param string|DateTime $start_date  the start date in YYYY-MM-DD format
+ *                        (can include time HH:MM:SS) or a DateTime object
+ * @param string $expect_spec  the expected result of the tests, in the
+ *               special interval specification used for this test suite.
+ *               This spec includes a "+" or "-" after the "P" in order to
+ *               indicate which direction to go.
+ * @param int $expect_days  the number of days to compare with the
+ *            interval's "days" property
+ * @param bool $absolute  should the result always be a positive number?
+ *
+ * @return void
+ */
+function examine_diff($end_date, $start_date, $expect_spec, $expect_days, $absolute = false) {
+       if (is_string($start_date)) {
+               $start = new DateTime($start_date);
+       } else {
+               $start = $start_date;
+       }
+       $start_date = $start->format('Y-m-d H:i:s T');
+
+       if (is_string($end_date)) {
+               $end = new DateTime($end_date);
+       } else {
+               $end = $end_date;
+       }
+       $end_date = $end->format('Y-m-d H:i:s T');
+
+       $force_sub = false;
+       if ($absolute) {
+               $tmp_interval = $start->diff($end);
+               if ($tmp_interval->format('%r')) {
+                       $force_sub = true;
+               }
+       }
+
+       $result_interval = $start->diff($end, $absolute);
+       $result_spec = $result_interval->format('P%R%yY%mM%dDT%hH%iM%sS');
+       $result_days = $result_interval->format('%a');
+
+       // Also make sure add()/sub() works the same way as diff().
+       if ($force_sub) {
+               $start->sub($result_interval);
+               $sign = '-';
+       } else {
+               $start->add($result_interval);
+               $sign = '+';
+       }
+
+       $result_end_date = $start->format('Y-m-d H:i:s T');
+
+       // Leaving this here for making adjustments later.
+       $expect_full = "FWD: $end_date - $start_date = **$expect_spec** | "
+               . "BACK: $start_date $sign $expect_spec = **$end_date** | "
+               . "DAYS: **$expect_days**";
+       // echo "$expect_full\n";
+       // return;
+
+       $result_full = "FWD: $end_date - $start_date = **$result_spec** | "
+               . "BACK: $start_date $sign $result_spec = **$result_end_date** | "
+               . "DAYS: **$result_days**";
+       echo "$result_full\n";
+}