bad usage of strtotime?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Erwin Moller

    bad usage of strtotime?

    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($date 1);
    $UTSdate2 = strtotime($date 2);

    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
    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.
    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($date 1,$now);
    $UTSdate2 = strtotime($date 2,$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
  • Erwin Moller

    #2
    Re: bad usage of strtotime?

    Erwin Moller schreef:

    <snip typo correction)
    Would this be better?
    $UTSnow = time();
    $UTSdate1 = strtotime($date 1,$now);
    $UTSdate2 = strtotime($date 2,$now);
    >
    should read of course:
    $UTSnow = time();
    $UTSdate1 = strtotime($date 1,$UTSnow);
    $UTSdate2 = strtotime($date 2,$UTSnow);

    Erwin

    Comment

    • Rik Wasmus

      #3
      Re: bad usage of strtotime?

      On Thu, 24 Apr 2008 10:49:41 +0200, Erwin Moller
      <Since_humans_r ead_this_I_am_s pammed_too_much @spamyourself.c omwrote:
      Erwin Moller schreef:
      >
      <snip typo correction)
      >
      >Would this be better?
      >$UTSnow = time();
      >$UTSdate1 = strtotime($date 1,$now);
      >$UTSdate2 = strtotime($date 2,$now);
      >>
      >
      should read of course:
      $UTSnow = time();
      $UTSdate1 = strtotime($date 1,$UTSnow);
      $UTSdate2 = strtotime($date 2,$UTSnow);
      Giving an explicit date will render the 'relative' part useless:
      <?php
      date_default_ti mezone_set('Eur ope/Amsterdam');
      $date = "2008-02-23";
      $UTSdate1 = strtotime($date );
      sleep(2);
      $UTSdate2 = strtotime($date );
      var_dump($UTSda te1,$UTSdate2);
      ?>
      Output:
      int(1203721200)
      int(1203721200)

      However, giving a relative date, they can differ:
      <?php
      date_default_ti mezone_set('Eur ope/Amsterdam');
      $date = "-2 hours";
      //without supplying relative to what:
      $UTSdate1 = strtotime($date );
      sleep(2);
      $UTSdate2 = strtotime($date );
      var_dump($UTSda te1,$UTSdate2);
      //with supplying a previously created timestamp:
      $now = time();
      $UTSdate1 = strtotime($date ,$now);
      sleep(2);
      $UTSdate2 = strtotime($date ,$now);
      var_dump($UTSda te1,$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.
      --
      Rik Wasmus

      Comment

      • Rik Wasmus

        #4
        Re: bad usage of strtotime?

        On Thu, 24 Apr 2008 11:00:45 +0200, Rik Wasmus
        <luiheidsgoeroe @hotmail.comwro te:
        On Thu, 24 Apr 2008 10:49:41 +0200, Erwin Moller
        <Since_humans_r ead_this_I_am_s pammed_too_much @spamyourself.c omwrote:
        >
        >Erwin Moller schreef:
        >>
        ><snip typo correction)
        >>
        >>Would this be better?
        >>$UTSnow = time();
        >>$UTSdate1 = strtotime($date 1,$now);
        >>$UTSdate2 = strtotime($date 2,$now);
        >>>
        >>
        >should read of course:
        >$UTSnow = time();
        >$UTSdate1 = strtotime($date 1,$UTSnow);
        >$UTSdate2 = strtotime($date 2,$UTSnow);
        >
        Giving an explicit date will render the 'relative' part useless:
        <?php
        date_default_ti mezone_set('Eur ope/Amsterdam');
        $date = "2008-02-23";
        $UTSdate1 = strtotime($date );
        sleep(2);
        $UTSdate2 = strtotime($date );
        var_dump($UTSda te1,$UTSdate2);
        ?>
        Output:
        int(1203721200)
        int(1203721200)
        >
        However, giving a relative date, they can differ:
        <?php
        date_default_ti mezone_set('Eur ope/Amsterdam');
        $date = "-2 hours";
        //without supplying relative to what:
        $UTSdate1 = strtotime($date );
        sleep(2);
        $UTSdate2 = strtotime($date );
        var_dump($UTSda te1,$UTSdate2);
        //with supplying a previously created timestamp:
        $now = time();
        $UTSdate1 = strtotime($date ,$now);
        sleep(2);
        $UTSdate2 = strtotime($date ,$now);
        var_dump($UTSda te1,$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

        Comment

        • Erwin Moller

          #5
          Re: bad usage of strtotime?

          Rik Wasmus schreef:
          On Thu, 24 Apr 2008 11:00:45 +0200, Rik Wasmus
          <luiheidsgoeroe @hotmail.comwro te:
          >
          >On Thu, 24 Apr 2008 10:49:41 +0200, Erwin Moller
          ><Since_humans_ read_this_I_am_ spammed_too_muc h@spamyourself. comwrote:
          >>
          >>Erwin Moller schreef:
          >>>
          >><snip typo correction)
          >>>
          >>>Would this be better?
          >>>$UTSnow = time();
          >>>$UTSdate1 = strtotime($date 1,$now);
          >>>$UTSdate2 = strtotime($date 2,$now);
          >>>>
          >>>
          >>should read of course:
          >>$UTSnow = time();
          >>$UTSdate1 = strtotime($date 1,$UTSnow);
          >>$UTSdate2 = strtotime($date 2,$UTSnow);
          >>
          >Giving an explicit date will render the 'relative' part useless:
          ><?php
          >date_default_t imezone_set('Eu rope/Amsterdam');
          >$date = "2008-02-23";
          >$UTSdate1 = strtotime($date );
          >sleep(2);
          >$UTSdate2 = strtotime($date );
          >var_dump($UTSd ate1,$UTSdate2) ;
          >?>
          >Output:
          >int(1203721200 )
          >int(1203721200 )
          >>
          >However, giving a relative date, they can differ:
          ><?php
          >date_default_t imezone_set('Eu rope/Amsterdam');
          >$date = "-2 hours";
          >//without supplying relative to what:
          >$UTSdate1 = strtotime($date );
          >sleep(2);
          >$UTSdate2 = strtotime($date );
          >var_dump($UTSd ate1,$UTSdate2) ;
          >//with supplying a previously created timestamp:
          >$now = time();
          >$UTSdate1 = strtotime($date ,$now);
          >sleep(2);
          >$UTSdate2 = strtotime($date ,$now);
          >var_dump($UTSd ate1,$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 misunderstandin g 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

          Comment

          • Captain Paralytic

            #6
            Re: bad usage of strtotime?

            On 24 Apr, 09:47, Erwin Moller
            <Since_humans_r ead_this_I_am_s pammed_too_m... @spamyourself.c omwrote:
            I think not after rereading the manual:
            >
            FROM:http://nl2.php.net/manual/en/function.strtotime.php
            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.
            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.

            Comment

            • Erwin Moller

              #7
              Re: bad usage of strtotime?

              Captain Paralytic schreef:
              On 24 Apr, 09:47, Erwin Moller
              <Since_humans_r ead_this_I_am_s pammed_too_m... @spamyourself.c omwrote:
              >I think not after rereading the manual:
              >>
              >FROM:http://nl2.php.net/manual/en/function.strtotime.php
              >
              > 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.
              >
              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 misunderstandin g of that relative part, and I
              think I keep programming PHP.

              Regards,
              Erwin Moller

              Comment

              • Rik Wasmus

                #8
                Re: bad usage of strtotime?

                On Thu, 24 Apr 2008 11:55:08 +0200, Erwin Moller
                <Since_humans_r ead_this_I_am_s pammed_too_much @spamyourself.c omwrote:
                Captain Paralytic schreef:
                >On 24 Apr, 09:47, Erwin Moller
                ><Since_humans_ read_this_I_am_ spammed_too_m.. .@spamyourself. comwrote:
                >>I think not after rereading the manual:
                >>>
                >>FROM:http://nl2.php.net/manual/en/function.strtotime.php
                >>
                >> 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.
                >>
                >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 misunderstandin g 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

                Comment

                • =?iso-8859-1?Q?Kim_Andr=E9_Aker=F8?=

                  #9
                  Re: bad usage of strtotime?

                  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($date 1);
                  $UTSdate2 = strtotime($date 2);
                  >
                  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
                  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.
                  >
                  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($date 1,$now);
                  $UTSdate2 = strtotime($date 2,$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@NOSPAM betadome.com
                  (remove NOSPAM to contact me directly)

                  Comment

                  • =?iso-8859-1?Q?Kim_Andr=E9_Aker=F8?=

                    #10
                    Re: bad usage of strtotime?

                    Erwin Moller wrote:
                    Captain Paralytic schreef:
                    On 24 Apr, 09:47, Erwin Moller
                    <Since_humans_r ead_this_I_am_s pammed_too_m... @spamyourself.c om>
                    wrote:
                    I think not after rereading the manual:
                    >
                    FROM:http://nl2.php.net/manual/en/function.strtotime.php
                    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.
                    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
                    misunderstandin g 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:


                    In the case of pure calendar dates:


                    And, in the case of "+5 days":


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

                    Comment

                    Working...