Quantcast
Channel: perl.perlfaq.workers
Viewing all articles
Browse latest Browse all 40

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

$
0
0
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";


Viewing all articles
Browse latest Browse all 40

Trending Articles