in reply to Comparing Dates With a Twist

Let's attack this slightly differently:

# get date 90 days ago my ($start_d, $start_m, $start_y) = (localtime(time - 90 * 86_400))[3,4,5]; my $start = sprintf('%4d-%02d-%02d', $start_y+1900, $start_m+1, $start_d); foreach (<FILE>) { my ($y, $m, $d) = (split /,/)[28,29,30]; my $date = sprintf('%4d-%02d-%02d', $y+1900, $m+1, $d); if ($start gt $date) { # record is more than 90 days old } else { # record is within 90 days } }

Update: buckaduck has caught me writing code before drinking coffee. And didn't even point out the worst problems with the code. The new version is (hopefully) better.

Update2: ergh! I give up. This time I was using numeric comparisons instead of string comparisons.

--
<http://www.dave.org.uk>

"The first rule of Perl club is you don't talk about Perl club."

Replies are listed 'Best First'.
Re: Re: Comparing Dates With a Twist
by buckaduck (Chaplain) on Nov 01, 2001 at 18:01 UTC
    His code has changed, and so has the error. Here was my original comment:

    What? Am I missing something here? It seems that there are two major flaws in this:

    1. I think that the comparison is backwards. If $y >= $start_y then the record is newer (not older) than the date 90 days ago.

    2. The date comparison strategy is all wrong. Would Nov. 3 come before Oct. 6, just because 3 <= 6?

    Update: And all of this assumes that there are no problems using localtime's month (zero-based) and year (minus 1900) to compare to the records...

    About the next version of the code:

    Is this method of comparing dates supposed to work in Perl? Not in my version, it doesn't. The dates '2001-10-06' and '2001-11-03' will be EQUAL in a numeric comparison. Numerically, they're both equal to 2001.

    And finally...

    Yes. This version will do nicely. I made davorg work pretty hard for my ++ this time...

    buckaduck