Edit report at http://bugs.php.net/bug.php?id=54048&edit=1

 ID:                 54048
 Comment by:         tomas dot brastavicius at quantum dot lt
 Reported by:        sheller0 at gmail dot com
 Summary:            unexpected strtotime() behavior with unix timestamps
 Status:             Open
 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:

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.


Previous Comments:
------------------------------------------------------------------------
[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

Reply via email to