FAQ 4.17 How do I find yesterday's date?

Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

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)

    To do it correctly, you can use one of the "Date" modules since they
    work with calendars instead of times. The "DateTime" module makes it
    simple, and give you the same time of day, only the day before, despite
    daylight saving time changes:

            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"

            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. For example, the rest of the
    suggestions will be wrong sometimes:

    Starting with Perl 5.10, "Time::Piece" and "Time::Seconds" are part of
    the standard distribution, so you might think that you could do
    something like this:

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

    The "Time::Piece" module exports a new "localtime" that returns an
    object, and "Time::Seconds" exports the "ONE_DAY" constant that is a set
    number of seconds. This means that it always gives the time 24 hours
    ago, which is not always yesterday. This can cause problems around the
    end of daylight saving time when there's one day that is 25 hours long.

    You have the same problem with "Time::Local", which will give the wrong
    answer for those same special cases:

            # 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]; # WRONG
             printf "Yesterday: %d-%02d-%02d\n", $y+1900, $m+1, $d;


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

Site Timeline