Quickly getting to YYYY-mm-dd HH:MM:SS in Perl

匿名 (未验证) 提交于 2019-12-03 02:44:02

问题:

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
  • 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".

回答1:

Use strftime in the standard POSIX module:

$ perl -MPOSIX -le 'print strftime "%F %T", localtime $^T' 

The arguments to strftime in Perl's binding were designed to align with the return values from localtime and gmtime.



回答2:

What 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; 


回答3:

Try this:

use POSIX qw/strftime/; print strftime('%Y-%m-%d',localtime); 

the strftime method does the job effectively for me. Very simple and efficient.




回答4:

Time::Piece (in core since Perl 5.10) also has a strftime function and by default overloads localtime and gmtime to return Time::Piece objects:

use Time::Piece; print localtime->strftime('%Y-%m-%d'); 

or without the overridden localtime:

use Time::Piece ();  print Time::Piece::localtime->strftime('%F %T'); 


回答5:

I made a little test (Perl v5.20.1 under FreeBSD in VM) calling the following blocks 1.000.000 times each:

A

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec); 

B

my $now = strftime('%Y%m%d%H%M%S',localtime); 

C

my $now = Time::Piece::localtime->strftime('%Y%m%d%H%M%S'); 

with the following results:

A: 2 seconds

B: 11 seconds

C: 19 seconds

This is of course not a thorough test or benchmark, but at least it is reproducable for me, so even though it is more complicated, I'd prefer the first method if generating a datetimestamp is required very often.

Calling (eg. under FreeBSD 10.1)

my $now = `date "+%Y%m%d%H%M%S" | tr -d "\n"`; 

might not be such a good idea because it is not OS-independent and takes quite some time.

Best regards, Holger



回答6:

if you just want a human readable time string and not that exact format:

$t = localtime; print "$t\n"; 

prints

Mon Apr 27 10:16:19 2015 

or whatever is configured for your locale.



回答7:

Time::Piece::datetime() can eliminate T.

use Time::Piece; print localtime->datetime(T => q{ }); 


回答8:

Short and sweet, no additional modules needed:

my $toDate = `date +%m/%d/%Y" "%l:%M:%S" "%p`; 

Output for example would be: 04/25/2017 9:30:33 AM



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!