|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2005-06-24 00:13 UTC] serge at skycomp dot ca
Description:
------------
It seems that strtotime is loosing time. I'm loosing 2 hours on every call to it and I'm not sure why.
The issue seems to be with the "at" text in the format string but I am unsure why the text "at" would make the timestamp lose exactly 2 hours.
Reproduce code:
---------------
<?
$_REQUEST['event_time']=strftime('%A, %B %e %Y at %r',strtotime($_REQUEST['event_time']));
?>
<form action='<?=$_SERVER['PHP_SELF']?>'>
<input size='50' type='text' name='event_time' value='<?=$_REQUEST['event_time']?>'
<input type="submit">
</form>
Expected result:
----------------
The output should be the formated representation from what was inputted. If sumbit is clicked again without changed the text field the value should not change since strtotime should generate a proper and valid timestamp which strftime formats again.
Actual result:
--------------
Relative to today I type:
friday at 7pm
click submit and the value of the text box is now:
Friday, June 24 2005 at 05:00:00 PM
I don't type or change anything. Simply click submit again:
Friday, June 24 2005 at 03:00:00 PM
Every time I click submit the timestamp looses 2 hours.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Nov 28 16:00:01 2025 UTC |
Ok I'll see about testing it agains the latest CVS if I have a chance. A 100% php example is as follows: <? $timestr="Friday at 7pm"; print "Starting Value: '$timestr'\n"; for( $x=1; $x<=10; $x++) { $timestr=strftime('%A, %B %e %Y at %r',strtotime($timestr)); print "The string is now: '$timestr'\n"; } ?>Results of testing on PHP-5.1-dev CVS (php5-200506222230), with various format strings: ============================================================== <?php $formats = array ( // CHANGE : RESULT ON PHP-5.1-DEV '%A, %B %e %Y at %r',// original: +1 week +12 hours '%A %B %e %Y at %r', // remove comma: +1 week +12 hours '%A %B %e %Y %r', // remove 'at': +1 week -2 hours '%r %A %B %e %Y', // move %r to front: +1 week '%r %B %e %Y' // remove the '%A' (day): -2 hours ); foreach ($formats as $format) { print "-------- $format -----------\n"; $timestr="Friday at 7pm"; print "Starting Value: '$timestr'\n"; for($x=1; $x<=10; $x++) { $tStamp = strtotime($timestr); $timestr=strftime($format,$tStamp); print "x: $x; timestr: '$timestr'; tStamp: $tStamp\n"; } } ?>Some corrections, updates, relevant information, and then questions for PHP-5.1-dev: ================================================================= Correction - This line: '%r %B %e %Y', // remove the '%A' (day): -2 hours Should say this instead: '%r %B %e %Y', // remove the '%A' (day): -14 hours ================================================================= Using this format string on PHP-5.1-dev leads to no change: '%r %B %e %Y %z' // Add the timezone: No change. ================================================================= Please see this comment at http://php.net/strftime about why 'at' cannot be used: The description of strtotime says that it can "Parse about any English textual datetime description into a UNIX timestamp". Be careful, however, when using "plain English". I was puzzled over why strtotime("June 23, 2003 at 12:00PM") returned a timestamp corresponding to 9:00 AM Central Time, until I realized the "at" was being interpreted as Azores Time or GMT+002. Writing strtotime("June 23, 2003 12:00PM") returned the correct timestamp. ================================================================= Also I think Derick Rethans has recently checked in the new strtotime() implementation in PHP-5.1-dev, so may get different results between 5.1-dev and PHP4. ================================================================= So the only unresolved questions I have for strtotime() in PHP-5.1-dev are whether these 3 formats should work: - '%A %B %e %Y %r' e.g.: 'Friday July 1 2005 10:00:00 AM' shouldn't the weekday be assumed to be part of the format string, rather than a modifier? shouldn't the current timezone be assumed, rather than GMT? - '%r %A %B %e %Y' e.g. '10:00:00 AM Friday July 1 2005' shouldn't the weekday be assumed to be part of the format string, rather than a modifier? shouldn't the current timezone be assumed, rather than GMT? - '%r %B %e %Y' e.g. '10:00:00 AM July 1 2005' shouldn't the current timezone be assumed, rather than GMT?