When writing Perl scripts I frequently find the need to obtain the current time represented as a string formatted as YYYY-mm-dd HH:MM:SS (say 2009-11-29 14:28:29).
In doing this I find myself taking this quite cumbersome path:
man perlfunc/localtimeto search for localtime – repeat five times (/+\n) to reach the relevant section of the manpage- Copy the string
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);from the manpage to my script. - Try with
my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $mon, $mday, $hour, $min, $sec); - Remember gotcha #1: Must add 1900 to $year to get current year.
- Try with
my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon, $mday, $hour, $min, $sec); - Remember gotcha #2: Must add 1 to $mon to get current month.
- Try with
my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec); - Seems ok. Done!
While the process outlined above works it is far from optimal. I’m sure there is a smarter way, so my question is simply:
What is the easiest way to obtain a YYYY-mm-dd HH:MM:SS of the current date/time in Perl?
Where “easy” encompasses both “easy-to-write” and “easy-to-remember”.
Use
strftimein the standardPOSIXmodule. The arguments tostrftimein Perl’s binding were designed to align with the return values fromlocaltimeandgmtime. Comparewith
Example command-line use is
or from a source file as in
Some systems do not support the
%Fand%Tshorthands, so you will have to be explicit withor
Note that
timereturns the current time when called whereas$^Tis fixed to the time when your program started. Withgmtime, the return value is the current time in GMT. Retrieve time in your local timezone withlocaltime.