Re: FAQ 4.17 How do I find yesterday's date?

[email protected] (James Wright) Mon, 07 Feb 2011 09:46:15 -0800
Newsgroups perl.perlfaq.workers
Message-ID <[email protected]>
On 02/07/11 03:00, PerlFAQ Server wrote:
> This is an excerpt from the latest version perlfaq4.pod, which
> comes with the standard Perl distribution. These postings aim to
> reduce the number of repeated questions as well as allow the community
> to review and update the answers. The latest version of the complete
> perlfaq is at http://faq.perl.org .
>
> --------------------------------------------------------------------
>
> 4.17: How do I find yesterday's date?
>
>      (contributed by brian d foy)
>
>      Use one of the Date modules. The "DateTime" module makes it simple, and
>      give you the same time of day, only the day before.
>
>              use DateTime;
>
>              my $yesterday = DateTime->now->subtract( days =>  1 );
>
>              print "Yesterday was $yesterday\n";
>
>      You can also use the "Date::Calc" module using its "Today_and_Now"
>      function.
>
>              use Date::Calc qw( Today_and_Now Add_Delta_DHMS );
>
>              my @date_time = Add_Delta_DHMS( Today_and_Now(), -1, 0, 0, 0 );
>
>              print "@date_time\n";
>
>      Most people try to use the time rather than the calendar to figure out
>      dates, but that assumes that days are twenty-four hours each. For most
>      people, there are two days a year when they aren't: the switch to and
>      from summer time throws this off. Let the modules do the work.
>
>      If you absolutely must do it yourself (or can't use one of the modules),
>      here's a solution using "Time::Local", which comes with Perl:
>
>              # contributed by Gunnar Hjalmarsson
>               use Time::Local;
>               my $today = timelocal 0, 0, 12, ( localtime )[3..5];
>               my ($d, $m, $y) = ( localtime $today-86400 )[3..5];
>               printf "Yesterday: %d-%02d-%02d\n", $y+1900, $m+1, $d;
>
>      In this case, you measure the day starting at noon, and subtract 24
>      hours. Even if the length of the calendar day is 23 or 25 hours, you'll
>      still end up on the previous calendar day, although not at noon. Since
>      you don't care about the time, the one hour difference doesn't matter
>      and you end up with the previous date.
>
>
>
> --------------------------------------------------------------------
>
> The perlfaq-workers, a group of volunteers, maintain the perlfaq. They
> are not necessarily experts in every domain where Perl might show up,
> so please include as much information as possible and relevant in any
> corrections. The perlfaq-workers also don't have access to every
> operating system or platform, so please include relevant details for
> corrections to examples that do not work on particular platforms.
> Working code is greatly appreciated.
>
> If you'd like to help maintain the perlfaq, see the details in
> perlfaq.pod.

Since the faq is for the current released version of Perl, where 
Time::Piece and Time::Seconds are in core (but DateTime and Date::Calc 
are not), wouldn't a Time::Piece / Time::Seconds answer be better than 
the ones using non-core modules or the too complicated one using 
Time::Local, something like:

use Time::Piece;
use Time::Seconds;

my $yesterday = localtime() - ONE_DAY;
print "Yesterday was $yesterday\n";


or

use Time::Piece ();
use Time::Seconds ();

my $yesterday = Time::Piece::localtime() - Time::Seconds::ONE_DAY;
print "Yesterday was $yesterday\n";