bad usage of strtotime?

bad usage of strtotime?

am 24.04.2008 10:47:19 von Erwin Moller

Hi group,

I have been using strtotime a lot in my code.
I wonder if I made a mistake in my thinking. :-/
Here follows a stripped down example.

consider some dates:
$date1 = "2008-02-23";
$date2 = "2008-02-23";
(They are the same)

Suppose I need to know if date1 is smaller/equal or bigger than date2.
I often used code like:
$UTSdate1 = strtotime($date1);
$UTSdate2 = strtotime($date2);

if ($UTSdate1 <= $UTSdate2){
// date1 before or equal to date2
} else {
// date1 after date2
}

Good, not?

I think not after rereading the manual:

FROM: http://nl2.php.net/manual/en/function.strtotime.php
[quote]
int strtotime ( string $time [, int $now ] )

The function expects to be given a string containing a US English date
format and will try to parse that format into a Unix timestamp (the
number of seconds since January 1 1970 00:00:00 GMT), relative to the
timestamp given in now , or the current time if now is not supplied.
[/quote]

The part "relative to the timestamp given in now" got me confused.

My question: Since the strtotime() is calculating 2 times the Unix Time
Stamp, do I risk that during execution of my script the second is
increased between the first call to strtotime() and the second, thus
making my above approach invalid?

Would this be better?
$UTSnow = time();
$UTSdate1 = strtotime($date1,$now);
$UTSdate2 = strtotime($date2,$now);

Should I change my code according to the second approach (using $UTSnow)?
I know chances of ticking a second are small in such a small piece of
code, but I don't want to deliver code that 'works most of the time'.

Thanks for any insights.

Regards,
Erwin Moller

Re: bad usage of strtotime?

am 24.04.2008 10:49:41 von Erwin Moller

Erwin Moller schreef:


> Would this be better?
> $UTSnow = time();
> $UTSdate1 = strtotime($date1,$now);
> $UTSdate2 = strtotime($date2,$now);
>

should read of course:
$UTSnow = time();
$UTSdate1 = strtotime($date1,$UTSnow);
$UTSdate2 = strtotime($date2,$UTSnow);

Erwin

Re: bad usage of strtotime?

am 24.04.2008 11:00:45 von luiheidsgoeroe

On Thu, 24 Apr 2008 10:49:41 +0200, Erwin Moller =

wrote:

> Erwin Moller schreef:
>
> >
>> Would this be better?
>> $UTSnow =3D time();
>> $UTSdate1 =3D strtotime($date1,$now);
>> $UTSdate2 =3D strtotime($date2,$now);
>>
>
> should read of course:
> $UTSnow =3D time();
> $UTSdate1 =3D strtotime($date1,$UTSnow);
> $UTSdate2 =3D strtotime($date2,$UTSnow);

Giving an explicit date will render the 'relative' part useless:
date_default_timezone_set('Europe/Amsterdam');
$date =3D "2008-02-23";
$UTSdate1 =3D strtotime($date);
sleep(2);
$UTSdate2 =3D strtotime($date);
var_dump($UTSdate1,$UTSdate2);
?>
Output:
int(1203721200)
int(1203721200)

However, giving a relative date, they can differ:
date_default_timezone_set('Europe/Amsterdam');
$date =3D "-2 hours";
//without supplying relative to what:
$UTSdate1 =3D strtotime($date);
sleep(2);
$UTSdate2 =3D strtotime($date);
var_dump($UTSdate1,$UTSdate2);
//with supplying a previously created timestamp:
$now =3D time();
$UTSdate1 =3D strtotime($date,$now);
sleep(2);
$UTSdate2 =3D strtotime($date,$now);
var_dump($UTSdate1,$UTSdate2);
?>
int(1209020255)
int(1209020257)
int(1209020257)
int(1209020257)

So you only have a problem with 'relative' datestrings ( +/- N hours, =

'last Saturday', etc.). Specific datestrings are not relative to anythin=
g =

in this context, so will yield the same output.
-- =

Rik Wasmus

Re: bad usage of strtotime?

am 24.04.2008 11:03:56 von luiheidsgoeroe

On Thu, 24 Apr 2008 11:00:45 +0200, Rik Wasmus =

wrote:

> On Thu, 24 Apr 2008 10:49:41 +0200, Erwin Moller =

> wrote:=

>
>> Erwin Moller schreef:
>>
>> >>
>>> Would this be better?
>>> $UTSnow =3D time();
>>> $UTSdate1 =3D strtotime($date1,$now);
>>> $UTSdate2 =3D strtotime($date2,$now);
>>>
>>
>> should read of course:
>> $UTSnow =3D time();
>> $UTSdate1 =3D strtotime($date1,$UTSnow);
>> $UTSdate2 =3D strtotime($date2,$UTSnow);
>
> Giving an explicit date will render the 'relative' part useless:
> > date_default_timezone_set('Europe/Amsterdam');
> $date =3D "2008-02-23";
> $UTSdate1 =3D strtotime($date);
> sleep(2);
> $UTSdate2 =3D strtotime($date);
> var_dump($UTSdate1,$UTSdate2);
> ?>
> Output:
> int(1203721200)
> int(1203721200)
>
> However, giving a relative date, they can differ:
> > date_default_timezone_set('Europe/Amsterdam');
> $date =3D "-2 hours";
> //without supplying relative to what:
> $UTSdate1 =3D strtotime($date);
> sleep(2);
> $UTSdate2 =3D strtotime($date);
> var_dump($UTSdate1,$UTSdate2);
> //with supplying a previously created timestamp:
> $now =3D time();
> $UTSdate1 =3D strtotime($date,$now);
> sleep(2);
> $UTSdate2 =3D strtotime($date,$now);
> var_dump($UTSdate1,$UTSdate2);
> ?>
> int(1209020255)
> int(1209020257)
> int(1209020257)
> int(1209020257)
>
> So you only have a problem with 'relative' datestrings ( +/- N hours, =
=

> 'last Saturday', etc.). Specific datestrings are not relative to =

> anything in this context, so will yield the same output.

And on a sidenote: depending on the circumstances, I usually compare =

timestamps which have to match within a margin of error (kind of like =

float comparisons):

if($date1 - $error < $date2 < $date1 + $error){
//equal enough for this comparison
} else {
//outside margin of error
}
-- =

Rik Wasmus

Re: bad usage of strtotime?

am 24.04.2008 11:24:01 von Erwin Moller

Rik Wasmus schreef:
> On Thu, 24 Apr 2008 11:00:45 +0200, Rik Wasmus
> wrote:
>
>> On Thu, 24 Apr 2008 10:49:41 +0200, Erwin Moller
>> wrote:
>>
>>> Erwin Moller schreef:
>>>
>>> >>>
>>>> Would this be better?
>>>> $UTSnow = time();
>>>> $UTSdate1 = strtotime($date1,$now);
>>>> $UTSdate2 = strtotime($date2,$now);
>>>>
>>>
>>> should read of course:
>>> $UTSnow = time();
>>> $UTSdate1 = strtotime($date1,$UTSnow);
>>> $UTSdate2 = strtotime($date2,$UTSnow);
>>
>> Giving an explicit date will render the 'relative' part useless:
>> >> date_default_timezone_set('Europe/Amsterdam');
>> $date = "2008-02-23";
>> $UTSdate1 = strtotime($date);
>> sleep(2);
>> $UTSdate2 = strtotime($date);
>> var_dump($UTSdate1,$UTSdate2);
>> ?>
>> Output:
>> int(1203721200)
>> int(1203721200)
>>
>> However, giving a relative date, they can differ:
>> >> date_default_timezone_set('Europe/Amsterdam');
>> $date = "-2 hours";
>> //without supplying relative to what:
>> $UTSdate1 = strtotime($date);
>> sleep(2);
>> $UTSdate2 = strtotime($date);
>> var_dump($UTSdate1,$UTSdate2);
>> //with supplying a previously created timestamp:
>> $now = time();
>> $UTSdate1 = strtotime($date,$now);
>> sleep(2);
>> $UTSdate2 = strtotime($date,$now);
>> var_dump($UTSdate1,$UTSdate2);
>> ?>
>> int(1209020255)
>> int(1209020257)
>> int(1209020257)
>> int(1209020257)
>>
>> So you only have a problem with 'relative' datestrings ( +/- N hours,
>> 'last Saturday', etc.). Specific datestrings are not relative to
>> anything in this context, so will yield the same output.
>
> And on a sidenote: depending on the circumstances, I usually compare
> timestamps which have to match within a margin of error (kind of like
> float comparisons):
>
> if($date1 - $error < $date2 < $date1 + $error){
> //equal enough for this comparison
> } else {
> //outside margin of error
> }

Thanks a lot Rik.
Very clear explanation. :-)

My confusion was clearly based on my total misunderstanding of the
'relative to' part, which was about a passed string like '+5 hours'.

Confusion cleared up now, and I feel a bit stupid too for asking. ;-)

Regards,
Erwin Moller

Re: bad usage of strtotime?

am 24.04.2008 11:37:28 von Captain Paralytic

On 24 Apr, 09:47, Erwin Moller
wrote:
> I think not after rereading the manual:
>
> FROM:http://nl2.php.net/manual/en/function.strtotime.php
> [quote]
> int strtotime ( string $time [, int $now ] )
>
> The function expects to be given a string containing a US English date
> format and will try to parse that format into a Unix timestamp (the
> number of seconds since January 1 1970 00:00:00 GMT), relative to the
> timestamp given in now , or the current time if now is not supplied.
> [/quote]
Hi Erwin,
in another recent thread I mentioned that the statement "The function
expects to be given a string containing a US English date format" is
contradicted later in the same page.

Re: bad usage of strtotime?

am 24.04.2008 11:55:08 von Erwin Moller

Captain Paralytic schreef:
> On 24 Apr, 09:47, Erwin Moller
> wrote:
>> I think not after rereading the manual:
>>
>> FROM:http://nl2.php.net/manual/en/function.strtotime.php
>> [quote]
>> int strtotime ( string $time [, int $now ] )
>>
>> The function expects to be given a string containing a US English date
>> format and will try to parse that format into a Unix timestamp (the
>> number of seconds since January 1 1970 00:00:00 GMT), relative to the
>> timestamp given in now , or the current time if now is not supplied.
>> [/quote]
> Hi Erwin,
> in another recent thread I mentioned that the statement "The function
> expects to be given a string containing a US English date format" is
> contradicted later in the same page.

Hi,

Yes, I can hardly say '+5 days' is an English date format.

Since we both get confused by this entry in the manual, I suggest
somebody rewrites it.
Or, of course, we both suck and should find another job than programming
PHP. ;-)
Anyway, Rik cleared up my misunderstanding of that relative part, and I
think I keep programming PHP.

Regards,
Erwin Moller

Re: bad usage of strtotime?

am 24.04.2008 12:14:17 von luiheidsgoeroe

On Thu, 24 Apr 2008 11:55:08 +0200, Erwin Moller
wrote:

> Captain Paralytic schreef:
>> On 24 Apr, 09:47, Erwin Moller
>> wrote:
>>> I think not after rereading the manual:
>>>
>>> FROM:http://nl2.php.net/manual/en/function.strtotime.php
>>> [quote]
>>> int strtotime ( string $time [, int $now ] )
>>>
>>> The function expects to be given a string containing a US English date
>>> format and will try to parse that format into a Unix timestamp (the
>>> number of seconds since January 1 1970 00:00:00 GMT), relative to the
>>> timestamp given in now , or the current time if now is not supplied.
>>> [/quote]
>> Hi Erwin,
>> in another recent thread I mentioned that the statement "The function
>> expects to be given a string containing a US English date format" is
>> contradicted later in the same page.
>
> Yes, I can hardly say '+5 days' is an English date format.

Well, '+5 dagen' or '+5 jours' is not understood, so I'd say it's english,
allthough not a date format :P

> Since we both get confused by this entry in the manual, I suggest
> somebody rewrites it.
> Or, of course, we both suck and should find another job than programming
> PHP. ;-)
> Anyway, Rik cleared up my misunderstanding of that relative part, and I
> think I keep programming PHP.

The manual of strtotime can be confusing yes. When in doubt, I just test,
which leads me to believe i should just take it as 'strtotime will expect
a dd/dd[/dd[dd]] string to be in US format' (and for instance not
dd-dd-dddd):
echo strtotime('02-03-1980');//320799600, 1980-03-02
echo strtotime('02/03/1980');//318380400, 1980-02-03
echo strtotime('02-03');//unrecognized, 1970-01-01
echo strtotime('02/03');//US, 2008-02-03

Indeed not clear from the manual, just trial and error...
--
Rik Wasmus

Re: bad usage of strtotime?

am 24.04.2008 12:15:17 von kimandre

Erwin Moller wrote:

> Hi group,
>
> I have been using strtotime a lot in my code.
> I wonder if I made a mistake in my thinking. :-/
> Here follows a stripped down example.
>
> consider some dates:
> $date1 = "2008-02-23";
> $date2 = "2008-02-23";
> (They are the same)
>
> Suppose I need to know if date1 is smaller/equal or bigger than date2.
> I often used code like:
> $UTSdate1 = strtotime($date1);
> $UTSdate2 = strtotime($date2);
>
> if ($UTSdate1 <= $UTSdate2){
> // date1 before or equal to date2
> } else {
> // date1 after date2
> }
>
> Good, not?
>
> I think not after rereading the manual:
>
> FROM: http://nl2.php.net/manual/en/function.strtotime.php
> [quote]
> int strtotime ( string $time [, int $now ] )
>
> The function expects to be given a string containing a US English
> date format and will try to parse that format into a Unix timestamp
> (the number of seconds since January 1 1970 00:00:00 GMT), relative
> to the timestamp given in now , or the current time if now is not
> supplied. [/quote]
>
> The part "relative to the timestamp given in now" got me confused.
>
> My question: Since the strtotime() is calculating 2 times the Unix
> Time Stamp, do I risk that during execution of my script the second
> is increased between the first call to strtotime() and the second,
> thus making my above approach invalid?
>
> Would this be better?
> $UTSnow = time();
> $UTSdate1 = strtotime($date1,$now);
> $UTSdate2 = strtotime($date2,$now);
>
> Should I change my code according to the second approach (using
> $UTSnow)? I know chances of ticking a second are small in such a
> small piece of code, but I don't want to deliver code that 'works
> most of the time'.
>
> Thanks for any insights.

Since you're specifying a specific date, instead of a relative date
string, the $now parameter won't have any effect. The output will in
any case be a standard Unix timestamp, which is the number of seconds
since Unix epoch (January 1 1970 00:00:00 GMT). In the case of the date
string "2008-02-23", the result will be the integer 1203721200, no
matter what you provide with $now.

If you had instead used, say, "+5 days", the timestamp difference would
only be measureable in microseconds, so unless you wanted extreme
precision (or you have a server that's so slow that the two instances
of strtotime() will take about 1 second to execute), I wouldn't bother
changing it.

--
Kim André Akerø
- kimandre@NOSPAMbetadome.com
(remove NOSPAM to contact me directly)

Re: bad usage of strtotime?

am 24.04.2008 12:18:55 von kimandre

Erwin Moller wrote:

> Captain Paralytic schreef:
> > On 24 Apr, 09:47, Erwin Moller
> >
> wrote:
> > > I think not after rereading the manual:
> > >
> > > FROM:http://nl2.php.net/manual/en/function.strtotime.php
> > > [quote]
> >> int strtotime ( string $time [, int $now ] )
> > >
> > > The function expects to be given a string containing a US English
> > > date format and will try to parse that format into a Unix
> > > timestamp (the number of seconds since January 1 1970 00:00:00
> > > GMT), relative to the timestamp given in now , or the current
> > > time if now is not supplied. [/quote]
> > Hi Erwin,
> > in another recent thread I mentioned that the statement "The
> > function expects to be given a string containing a US English date
> > format" is contradicted later in the same page.
>
> Hi,
>
> Yes, I can hardly say '+5 days' is an English date format.
>
> Since we both get confused by this entry in the manual, I suggest
> somebody rewrites it. Or, of course, we both suck and should find
> another job than programming PHP. ;-) Anyway, Rik cleared up my
> misunderstanding of that relative part, and I think I keep
> programming PHP.

If you look further down in the manual:

> time
>
> The string to parse, according to the GNU » Date Input Formats syntax.

The text "» Date Input Formats" links to the GNU documentation on date
input formats:
http://www.gnu.org/software/tar/manual/html_node/tar_113.htm l

In the case of pure calendar dates:
http://www.gnu.org/software/tar/manual/html_node/tar_115.htm l

And, in the case of "+5 days":
http://www.gnu.org/software/tar/manual/html_node/tar_119.htm l

--
Kim André Akerø
- kimandre@NOSPAMbetadome.com
(remove NOSPAM to contact me directly)