在编写 Perl 脚本时,我经常发现需要将当前时间表示为格式为 YYYY-mm-dd HH:MM:SS
的字符串(比如 2009-11-29 14:28:29
).
在这样做的过程中,我发现自己走的是一条相当繁琐的道路:
man perlfunc
/localtime
搜索本地时间 - 重复五次 (/
+ \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 );
- 记住问题 #1:必须在 $year 上加上 1900 才能得到当前年份。
- 试试
my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon, $mday, $hour, $min, $sec);
- 记住问题 #2:必须在 $mon 上加 1 才能获得当前月份。
- 试试
my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $ min, $sec);
- 看起来还可以。完成!
虽然上述过程有效,但远非最佳。我确信有更聪明的方法,所以我的问题很简单:
在 Perl 中获取当前日期/时间的 YYYY-mm-dd HH:MM:SS
的最简单方法是什么?
“简单”包含“易于编写”和“易于内存”。
在标准POSIX
中使用strftime
模块。 strftime
的参数在 Perl 的绑定(bind)中,旨在与 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
,返回值是格林威治标准时间的当前时间。使用 localtime
检索您本地时区的时间.
我是一名优秀的程序员,十分优秀!