in reply to Date munging suddenly broken

I'm not clear how this would have ever worked, since your always subtract $then from $now, which means dates will always be in the past, never in the future.

In addition, according to the 'man -f localtime' page, Sunday is day 0, so Friday would be day 5, not day 4. By changing the 4's to 5's, you at least will get the most recent previous Friday.

If you can take a slight performance hit of loading a slightly large module, use Date::Manip. This is a tried and trusted module, and will allow text descriptions of dates you're looking for, like below.
#!/usr/local/bin/perl -w use strict; use Date::Manip; { print ParseDate ("next Friday"); }
--Chris

e-mail jcwren

Replies are listed 'Best First'.
Re: Date munging suddenly broken
by motomuse (Sexton) on Oct 05, 2000 at 01:59 UTC
    I know that 4 is Thursday; that's intentional. People in general start creating their status reports on Thursday -- if they start on Wednesday, I want them to append to the previous Friday. If it's Thursday, I want them to append to the coming Friday. Sorry I didn't make that clear.

    Anyway, irrespective of that, performance isn't particularly an issue with this, so I'll gladly take your advice re: loading the said module. Thanks!

        - Muse

      Ah, OK. Here's a version that does it algorithmically, rather than using Date::Manip. You'll have to correct for the "If it's Thursday" problem, but this will generate a list of all Friday's in the year.

      Also, just as a side note, if you're not using 'use strict', and -w, I'd highly recommend enabling that. It'll help you track down problems a lot faster.
      #!/usr/local/bin/perl -w use strict; use Time::Local 'timelocal_nocheck'; { my $friday_date; my $now = time (); # Not used, here, but it's where the time would + come from for (my $i = 0; $i < 365; $i++) { $now = timelocal_nocheck (0, 0, 0, $i, 0, 2000); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$rest) = localtime ($ +now); my $then = ((((5 - $wday) + 7) % 7) * (60 * 60 * 24)); ($sec,$min,$hour,$mday,$mon,$year,$rest) = localtime ($now + $th +en); $mon += 1; $year += 1900; my $temp = sprintf ("%02d/%02d/%04d", $mon, $mday, $year); if ($friday_date ne $temp) { print "$temp\n"; $friday_date = $temp; } } }
      --Chris

      e-mail jcwren
      So, you want something like:
      $now = time; $hour = (localtime $now)[2]; $now += (12 - $hour)*60*60; # offset to noon-hour so DST doesn't fry u +s $dow = (localtime $now)[6]; $now += (($dow < 4 ? -2 : 5) - $dow)*24*60*60; ($y, $m, $d) = (localtime $now)[5,4,3]; $file = sprintf "%d_%d_%d.html", $m+1, $d, $y+1900;
      perhaps?

      -- Randal L. Schwartz, Perl hacker