Edit report at http://bugs.php.net/bug.php?id=54048&edit=1
ID: 54048 Updated by: der...@php.net Reported by: sheller0 at gmail dot com Summary: unexpected strtotime() behavior with unix timestamps -Status: Open +Status: Bogus Type: Bug Package: Date/time related Operating System: Ubuntu 11.04 PHP Version: 5.3.5 Block user comment: N Private report: N New Comment: Sorry, but your problem does not imply a bug in PHP itself. For a list of more appropriate places to ask for help using PHP, please visit http://www.php.net/support.php as this bug system is not the appropriate forum for asking support questions. Due to the volume of reports we can not explain in detail here why your report is not a bug. The support channels will be able to provide an explanation for you. Thank you for your interest in PHP. Previous Comments: ------------------------------------------------------------------------ [2011-03-02 16:36:59] tomas dot brastavicius at quantum dot lt If you want to pass a timestamp to strtotime() function you must prepend the timestamp with '@' character. See http://www.php.net/manual/en/datetime.formats.compound.php Since you do not prepend '@' character, strtotime() assumes that you are passing other than timestamp formatted string. For example, digits "1009584000" is interpreted as 10 hour 9 minutes 58 seconds, 4000 year. Some function calls fails because no format matches given digits. If you want to test a string against timestamp, you may use preg_match() function. ------------------------------------------------------------------------ [2011-02-18 20:30:02] sheller0 at gmail dot com Description: ------------ I'm working on a payment processor which unfortunately has to take several types of date input, as a result I need to test if a date I'm being passed is already a unix timestamp. For the most part strtotime() will return false when passed a timestamp. There are a few edge cases where it will return another timestamp sometime after year 2400 or before 2000. If this is actually the expected behavior it might be worthwhile to throw a warning in the documentation about passing strtotime() unix timestamps Test script: --------------- $errors = 0; $end_date = strtotime('January 1st 2020'); $start_date = strtotime('January 1st 2001'); $bad_years = array(); while ($start_date < $end_date){ if (strtotime($start_date) !== false){ echo date ('Y-m-d', $start_date) . ' generates ' . strtotime($start_date) . ' ' . date('Y-m-d', strtotime($start_date)) . "\n"; $bad_years[] = date('Y', strtotime($start_date)); $errors++; } $start_date += 86400; } print_r(array_unique($bad_years)); echo "$errors errors generated\n"; Expected result: ---------------- sam.heller@sam:/var/www/development/api/app/scripts$ php test.php Array ( ) 0 errors generated sam.heller@sam:/var/www/development/api/app/scripts$ Actual result: -------------- sam.heller@sam:/var/www/development/api/app/scripts$ php test.php 2001-09-14 generates 51442009244 3600-02-18 2001-09-15 generates -62163017947 0000-02-18 2001-09-25 generates 64064790099 4000-02-18 2001-09-26 generates -49540237092 0400-02-18 ... ... ... 2019-05-22 generates -24294654070 1200-02-18 2019-05-23 generates 177669838738 7600-02-18 2019-06-02 generates -11671873215 1600-02-18 2019-06-03 generates 190292619593 8000-02-18 Array ( [0] => 3600 [1] => 0000 [2] => 4000 [3] => 0400 [4] => 6800 [5] => 0800 [6] => 7200 [8] => 1200 [9] => 7600 [11] => 8000 [12] => 4400 [14] => 8400 [15] => 4800 [17] => 5200 [18] => 1600 [20] => 2000 [22] => 2400 [23] => 8800 [25] => 9200 [26] => 5600 [28] => 9600 [29] => 6000 [31] => 6400 [32] => 2800 [34] => 3200 ) 1007 errors generated sam.heller@sam:/var/www/development/api/app/scripts$ ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=54048&edit=1