Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

How to get last day of 2 months ago

by dirtdog (Scribe)
on Mar 11, 2011 at 15:14 UTC ( #892673=perlquestion: print w/replies, xml ) Need Help??
dirtdog has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, I'm trying to get the last day of the month from 2 months ago. For example, Since the current month is March i'd like to get a date range of 1/31/2011 to 2/28/2011. And If current month was February..then i'd want 12/31/2010 to 01/31/2011. The code i'm using is below...I really appreciate your help!

#!/usr/bin/env perl use POSIX 'strftime'; my @t = (localtime(time)); #mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0 +); my $lastday = POSIX::mktime(0,0,0,0,$t[4],$t[5],0,0,-1); my $lastday_prev = POSIX::mktime(0,0,0,0,$t[3],$t[5],0,0,-1); my @ld_prev = localtime($lastday_prev); my @ld = localtime($lastday); print "ld is $ld[3]\n"; print "ld_prev is $ld_prev[3]\n"; my $monthly_date_beg = strftime('%m/' . $ld_prev[3] . '/%Y', $t[0],$t[ +1], $t[2], $t[3], $t[4]-2, $t[5]); my $monthly_date_end = strftime('%m/' . $ld[3] . '/%Y', $t[0],$t[1], $ +t[2], $t[3], $t[4]-1, $t[5]); rint "beg = $monthly_date_beg\n"; print "end = $monthly_date_end\n";

Replies are listed 'Best First'.
Re: How to get last day of 2 months ago
by Corion (Pope) on Mar 11, 2011 at 16:05 UTC

    The key to finding the "last day of a month" is to realize that the "last day" of a month is always one day before the "first day" of the next month. As the date of the first day of a month is easy to construct, you just have to construct the first day of the current month, then go to the last day of the month before. Then extract the year and month of that month, and construct its first day from it. Repeat until you have skipped enough months.

    Personally, I like to use Time::Local and localtime, together with POSIX::strftime to manipulate and create date strings. The more heavyweight and somewhat different approach is to use DateTime, but as I often have to do date calculations, and not always in Perl, the strftime approach has worked more often for me than the DateTime approach.

      Thank you all for the replies. I did figure out what i was doing wrong..I had

      $t[3]

      ..when i should have had

      $t[4]-1
      use POSIX 'strftime'; my @t = (localtime(time)); my $lastday = POSIX::mktime(0,0,0,0,$t[4],$t[5],0,0,-1); my $lastday_prev = POSIX::mktime(0,0,0,0,$t[4]-1,$t[5],0,0,-1); my @ld_prev = localtime($lastday_prev); my @ld = localtime($lastday); my $monthly_date_beg = strftime('%m/' . $ld_prev[3] . '/%Y', $t[0],$t[ +1], $t[2], $t[3], $t[4]-2, $t[5]); my $monthly_date_end = strftime('%m/' . $ld[3] . '/%Y', $t[0],$t[1], $ +t[2], $t[3], $t[4]-1, $t[5]); print "beg = $monthly_date_beg\n"; print "end = $monthly_date_end\n";
Re: How to get last day of 2 months ago
by Anonymous Monk on Mar 11, 2011 at 15:20 UTC
Re: How to get last day of 2 months ago
by JavaFan (Canon) on Mar 11, 2011 at 15:38 UTC
    sub last_day_2_months_ago {31;} # Correct most of the time
Re: How to get last day of 2 months ago
by Anonymous Monk on Mar 11, 2011 at 17:01 UTC
    #!/usr/bin/perl use strict; use warnings; use 5.012; use Time::Local qw( timegm_nocheck ); my ($y, $m, $d) = (localtime)[5,4,3]; my $start = scalar gmtime(timegm_nocheck(0,0,0, (1-1), $m-1, $y)); my $end = scalar gmtime(timegm_nocheck(0,0,0, (1-1), $m, $y)); say "Today is " . localtime; say join "\n", $start, $end;
    ** prints
    Today is Fri Mar 11 11:56:50 2011 Mon Jan 31 00:00:00 2011 Mon Feb 28 00:00:00 2011

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://892673]
Approved by broomduster
help
Chatterbox?
[Marshall]: stevieb wish you well with water problems, my water was off all day Monday for repairs. Any more progress on .exe info problem?.
[stevieb]: Marshall: no. I commented on the thread yesterday. Visual Studio updates the tags ok, but corrupts the exe
[stevieb]: I advised the OP that a possible workaround would be to add a version function/flag that displays the required copyright/license info instead
[Marshall]: Darn! I'll look at the thread. Must not be updatinga byte count somewhere. The .exe format is a complex critter.
[stevieb]: that way, it's still "hard coded" into the exe at least, despite not being visible via Properties
[Marshall]: I also looked into PerlApp from Active State, but they don't sell their Dev Kit independent of a very expensive ($1,200) per year license anymore.

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (11)
As of 2016-12-08 18:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    On a regular basis, I'm most likely to spy upon:













    Results (144 votes). Check out past polls.