Edit report at https://bugs.php.net/bug.php?id=62326&edit=1
ID: 62326 Comment by: ploeger dot private at googlemail dot com Reported by: ploeger dot private at googlemail dot com Summary: date_diff() function returns false result Status: Open Type: Bug Package: Class/Object related Operating System: Windows Server 2008 R2 PHP Version: 5.3Git-2012-06-14 (snap) Block user comment: N Private report: N New Comment: Test script to show the behavior of the bug: Test script: --------------- <?php const start_date = '2012-06-01 00:00:00'; const end_date = '2012-12-01 00:00:00'; $timezones = array('europe/Berlin', 'GMT', 'CET', 'UTC'); $possibleTimezones = DateTimeZone::listIdentifiers(); $possibleTimezones = array_map('strtolower', $possibleTimezones); foreach ( $timezones as $testZone ) { $cur = new DateTimeZone($testZone); $start = date_create(start_date, $cur); $end = date_create(end_date, $cur); $info[] = join(array( 'Soll-TZ : '.$testZone.PHP_EOL, 'Differenz : '.( $start->diff($end)->format('%y Jahre %m Monate %d Monatstage ( %a tage total )') ).PHP_EOL, 'gelisted : '.( in_array(strtolower($testZone), $possibleTimezones) ? 'Ja' : 'Nein' ).PHP_EOL, 'Alias : '.( strcasecmp($testZone, $cur->getName()) == 0 ? 'Nein' : 'Ja' ).PHP_EOL, 'Ist-TZ : '.( $cur->getName() ).PHP_EOL, 'start OfS : '.( ( $cur->getOffset($start) / 60 / 60 ) ).' Stunden'.PHP_EOL, 'end OfS : '.( ( $cur->getOffset($end) / 60 / 60 ) ).' Stunden'.PHP_EOL )); } echo join('--- '.PHP_EOL, $info); Result: ---------------- Soll-TZ : europe/Berlin Differenz : 0 Jahre 5 Monate 30 Monatstage ( 183 tage total ) gelisted : Ja Alias : Nein Ist-TZ : Europe/Berlin start OfS : 2 Stunden end OfS : 1 Stunden --- Soll-TZ : GMT Differenz : 0 Jahre 6 Monate 0 Monatstage ( 183 tage total ) gelisted : Nein Alias : Ja Ist-TZ : UTC start OfS : 0 Stunden end OfS : 0 Stunden --- Soll-TZ : CET Differenz : 0 Jahre 5 Monate 30 Monatstage ( 183 tage total ) gelisted : Nein Alias : Ja Ist-TZ : Europe/Berlin start OfS : 2 Stunden end OfS : 1 Stunden --- Soll-TZ : UTC Differenz : 0 Jahre 6 Monate 0 Monatstage ( 183 tage total ) gelisted : Ja Alias : Nein Ist-TZ : UTC start OfS : 0 Stunden end OfS : 0 Stunden Previous Comments: ------------------------------------------------------------------------ [2012-06-14 19:55:15] juergen78 at gmail dot com My Hosters OS: Linux alfa3025 2.6.32-bpo.5-amd64 #1 SMP Wed Jul 20 09:10:04 UTC 2011 x86_64 Code: ----- date_default_timezone_set("Europe/Berlin"); $start_timestamp = date_create('2012-06-01'); $end_timestamp = date_create('2012-12-01'); $difference = date_diff($start_timestamp, $end_timestamp); $difference = $difference->format('%M'); echo $difference; Output: 05 ------------------------------------------------------------------------ [2012-06-14 19:13:58] ploeger dot private at googlemail dot com I could reproduce the bug on WinXP Pro SP3, Win Server 2008 R2 and Win7 Pro. Default Timezone: Europe/Berlin Workaround with correct result: date_default_timezone_set("UTC"); $start_timestamp = date_create('2012-06-01'); $end_timestamp = date_create('2012-12-01'); $difference = date_diff($start_timestamp, $end_timestamp); var_dump($difference); //6 months Could you reproduce the bug with: date.timezone = "Europe/Berlin" in php.ini on linux? ------------------------------------------------------------------------ [2012-06-14 19:00:49] ras...@php.net That output 06 on Linux ------------------------------------------------------------------------ [2012-06-14 18:52:28] ploeger dot private at googlemail dot com Description: ------------ The source code will return 05 instead of 06. If you change the day to 02 instead of 01 in start_timestamp and end_timestamp everything seems to work correct. Debug: print_r($start_timestamp); Result: DateTime Object ( [date] => 2012-06-01 00:00:00 [timezone_type] => 3 [timezone] => Europe/Berlin ) print_r($end_timestamp); Result: DateTime Object ( [date] => 2012-12-01 00:00:00 [timezone_type] => 3 [timezone] => Europe/Berlin ) Test script: --------------- $start_timestamp = date_create('2012-06-01'); $end_timestamp = date_create('2012-12-01'); $difference = date_diff($start_timestamp, $end_timestamp); $difference = $difference->format('%M'); Expected result: ---------------- 06 Actual result: -------------- 05 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=62326&edit=1