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