http://www.perlmonks.org?node_id=268828

Gwalchmai has asked for the wisdom of the Perl Monks concerning the following question:

Brothers, I seek knowledge of POSIX. Yeah I know how to return the current date using strftime(%Y%m%d, localtime). But how can you return the date from 14 days ago?

Replies are listed 'Best First'.
Re: POSIX strftime
by davorg (Chancellor) on Jun 25, 2003 at 12:39 UTC

    Nothing to do with POSIX. you just need to work out how to get the correct date out of localtime.

    use constant DAY => 60 * 60 * 24; use POSIX 'strftime'; print strftime('%Y%m%d', localtime(time - (14 * DAY)));
    --
    <http://www.dave.org.uk>

    "The first rule of Perl club is you do not talk about Perl club."
    -- Chip Salzenberg

Re: POSIX strftime
by crouchingpenguin (Priest) on Jun 25, 2003 at 12:30 UTC

    How about:

    print POSIX::strftime('%Y%m%d', localtime),"\n"; my @parts = localtime(); $parts[3] -= 14; print POSIX::strftime('%Y%m%d', @parts),"\n";

    Update: Sure, why not davorg? :) After all, strftime expects a list after the format:

    Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1 +, yday = -1, isdst = -1)

    YA-Update:

    #!/usr/bin/perl use strict; use warnings; use POSIX; use Benchmark qw( cmpthese ); use constant DAY => 60 * 60 * 24; sub use_array { my @parts = localtime(); $parts[3] -= 14; return POSIX::strftime('%Y%m%d', @parts); } sub use_math { return POSIX::strftime( '%Y%m%d', localtime(time - (14 * (60 * 60 * 24))) ); } sub use_math_with_const { return POSIX::strftime('%Y%m%d', localtime(time - (14 * DAY ))); } cmpthese( 90000, { 'use_array' => sub { use_array(); }, 'use_math' => sub { use_math(); }, 'use_math_with_const' => sub { use_math_with_const(); }, }, ); __DATA__ Benchmark: timing 90000 iterations of use_array, use_math, use_math_wi +th_const... use_array: 6 wallclock secs ( 5.67 usr + 0.10 sys = 5.77 CPU) @ 15 +597.92/s (n=90000) use_math: 4 wallclock secs ( 3.63 usr + 0.11 sys = 3.74 CPU) @ 24 +064.17/s (n=90000) use_math_with_const: 3 wallclock secs ( 3.70 usr + 0.05 sys = 3.75 +CPU) @ 24000.00/s (n=90000) Rate use_array use_math_with_const + use_math use_array 15598/s -- -35% + -35% use_math_with_const 24000/s 54% -- + -0% use_math 24064/s 54% 0% + --

    cp
    ----
    "Never be afraid to try something new. Remember, amateurs built the ark. Professionals built the Titanic."

      I have to say that I'm surprised (and more than a little appalled) to see that this works :)

      Update: To clarify. The bit that surprises me is that $parts[3] -= 14; works even when the calculation makes $parts[3] negative.

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

      "The first rule of Perl club is you do not talk about Perl club."
      -- Chip Salzenberg

Re: POSIX strftime
by BrowserUk (Patriarch) on Jun 25, 2003 at 12:39 UTC

    perl -mPOSIX -eprint+POSIX::strftime('%Y%m%d',localtime(time-(14*60*60*24)))


    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller


Re: POSIX strftime
by nite_man (Deacon) on Jun 25, 2003 at 12:53 UTC

    If you need to do with dates some operations, try to look at The Perl DateTime Project, which produces a suite of inter-operable modules for dealing with dates and times.

    Also you can use my module Date. Maybe it will be useful for you.

          
    --------------------------------
    SV* sv_bless(SV* sv, HV* stash);
    
Re: POSIX strftime
by xdg (Monsignor) on Jun 25, 2003 at 14:25 UTC

    Again, as an alternative to POSIX, you can get a lot of nicely parsed offset functionality with Date::Manip.

    $ perl -MDate::Manip -e 'print ParseDate("14 days ago")."\n"' 2003061110:22:53 $ perl -MDate::Manip -e 'print UnixDate("14 days ago","%Y%m%d")."\n"' 20030611 $ perl -MDate::Manip -e 'print localtime(UnixDate("14 days ago","%s")) +."\n"' Wed Jun 11 10:23:04 2003

    -xdg