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".
$Diff."\n"; This is a simple way to find the time difference in seconds.
You can use the POSIX function strftime() to format date and time with the help of the following table.
Use POSIX::tzset.
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
.
Why not use the DateTime
module to do the dirty work for you? It's easy to write and remember!
use strict; use warnings; use DateTime; my $dt = DateTime->now; # Stores current date and time as datetime object my $date = $dt->ymd; # Retrieves date as a string in 'yyyy-mm-dd' format my $time = $dt->hms; # Retrieves time as a string in 'hh:mm:ss' format my $wanted = "$date $time"; # creates 'yyyy-mm-dd hh:mm:ss' string print $wanted;
Once you know what's going on, you can get rid of the temps and save a few lines of code:
use strict; use warnings; use DateTime; my $dt = DateTime->now; print join ' ', $dt->ymd, $dt->hms;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With