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] [email protected]
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