当写Perl脚本我经常发现需要获得代表当前时间为一个字符串格式化为YYYY-mm-dd HH:MM:SS
(比如2009-11-29 14:28:29
)。
在这一过程中,我发现自己采取这一非常麻烦路径:
man perlfunc
/localtime
搜索本地时间 - 重复5次(/
+ \n
)到达手册页的相关章节($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
的手册页给我的脚本复制。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);
尝试虽然过程中上述工作是远远没有达到最佳。我敢肯定有一个更聪明的办法,所以我的问题很简单:
什么是获得在Perl当前日期/时间YYYY-mm-dd HH:MM:SS
最简单的方法?
其中,“易”包括“易写”和“容易记住”。
标准strftime
模块中使用POSIX
。该参数strftime
在Perl的结合被设计成与localtime
和gmtime
的返回值一致。相比
strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
同
my ($sec,$min,$hour,$mday,$mon,$year,$wday, $yday, $isdst) = gmtime(time);
示例命令行使用是
$ perl -MPOSIX -le 'print strftime "%F %T", localtime $^T'
或从源文件中
use POSIX;
print strftime "%F %T", localtime time;
有些系统不支持%F
和%T
速记,所以你必须要明确的用
print strftime "%Y-%m-%d %H:%M:%S", localtime time;
要么
print strftime "%Y-%m-%d %H:%M:%S", gmtime time;
需要注意的是time
返回调用的时候,而$^T
程序启动时被固定在当前时间。随着gmtime
,返回值是GMT当前时间。检索时间在您的本地时区与localtime
。
什么不能用DateTime
模块做肮脏的工作吗?这很容易写,切记!
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;
一旦你知道发生了什么事情,你可以摆脱临时工和保存的几行代码:
use strict;
use warnings;
use DateTime;
my $dt = DateTime->now;
print join ' ', $dt->ymd, $dt->hms;
尝试这个:
use POSIX qw/strftime/;
print strftime('%Y-%m-%d',localtime);
该strftime
方法有效地做这项工作对我来说。很简单,高效。
Time::Piece(在因为Perl 5.10核心),也有一个strftime函数和默认的重载的localtime和gmtime的返回时间::件物品:
use Time::Piece;
print localtime->strftime('%Y-%m-%d');
或无覆盖的本地时间:
use Time::Piece ();
print Time::Piece::localtime->strftime('%F %T');
我做了一个小测试(在FreeBSD的VM下的Perl v5.20.1)调用下面的块中的每一1.000.000次:
一种
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);
乙
my $now = strftime('%Y%m%d%H%M%S',localtime);
C
my $now = Time::Piece::localtime->strftime('%Y%m%d%H%M%S');
结果如下:
甲:2秒
B:11秒
C:19秒
这当然不是一个完整的测试或基准的,但至少它是可再现的我,所以尽管它是比较复杂的,如果需要产生datetimestamp很多时候我更喜欢第一种方法。
调用(如FreeBSD的10.1下)
my $now = `date "+%Y%m%d%H%M%S" | tr -d "\n"`;
可能不是一个好主意,因为它不是独立于操作系统的,并需要相当长的时间。
最好的问候,霍尔格
Time::Piece::datetime()
可以消除T
。
use Time::Piece;
print localtime->datetime(T => q{ });
如果你只想要一个人类可读的时间字符串,不,准确的格式:
$t = localtime;
print "$t\n";
版画
Mon Apr 27 10:16:19 2015
或任何配置为您的语言环境。
简短而亲切的,没有额外的模块需要:
my $toDate = `date +%m/%d/%Y" "%l:%M:%S" "%p`;
例如输出将是:2017年4月25日上午9时三十分33秒
在许多情况下,所需要的“当前时间”是相当$ ^ T,这是自UNIX新纪元在该脚本开始运行,全部按秒计算(假设只60秒分钟)的时间。
这防止脚本的早期部分使用比一个脚本的后面部分不同日期(或夏令状态),例如,在查询条件和其他导出的值。
对于“当前时间”,变式,可以使用一个常量,也记录它是在编译时冻结:
use constant YMD_HMS_AT_START => POSIX::strftime( "%F %T", localtime $^T );
替代更高分辨率的启动时间:
0+ [ Time::HiRes::stat("/proc/$$") ]->[10]