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
/localtime
to search for localtime - repeat five times (/
+ \n
) to reach the relevant section of the manpage($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
from the manpage to my script.my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $mon, $mday, $hour, $min, $sec);
my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon, $mday, $hour, $min, $sec);
my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
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 strftime
in the standard POSIX
module. The arguments to strftime
in Perl’s binding were designed to align with the return values from localtime
and gmtime
. Compare
strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
with
my ($sec,$min,$hour,$mday,$mon,$year,$wday, $yday, $isdst) = gmtime(time);
Example command-line use is
$ perl -MPOSIX -le 'print strftime "%F %T", localtime $^T'
or from a source file as in
use POSIX;
print strftime "%F %T", localtime time;
Some systems do not support the %F
and %T
shorthands, so you will have to be explicit with
print strftime "%Y-%m-%d %H:%M:%S", localtime time;
or
print strftime "%Y-%m-%d %H:%M:%S", gmtime time;
Note that time
returns the current time when called whereas $^T
is fixed to the time when your program started. With gmtime
, the return value is the current time in GMT. Retrieve time in your local timezone with localtime
.