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