赶快前往YYYY-MM-DD HH:MM:SS在Perl

问题描述 投票:60回答:9

当写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);尝试
  • 记住疑难杂症#1:必须增加1900至$年获得当年。
  • my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon, $mday, $hour, $min, $sec);尝试
  • 记住疑难杂症#2:必须添加到$周一获得当前月。
  • my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);尝试
  • 似乎确定。完成!

虽然过程中上述工作是远远没有达到最佳。我敢肯定有一个更聪明的办法,所以我的问题很简单:

什么是获得在Perl当前日期/时间YYYY-mm-dd HH:MM:SS最简单的方法?

其中,“易”包括“易写”和“容易记住”。

perl datetime formatting timestamp
9个回答
71
投票

标准strftime模块中使用POSIX。该参数strftime在Perl的结合被设计成与localtimegmtime的返回值一致。相比

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


32
投票

什么不能用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;

30
投票

尝试这个:

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

strftime方法有效地做这项工作对我来说。很简单,高效。



13
投票

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');

5
投票

我做了一个小测试(在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"`;

可能不是一个好主意,因为它不是独立于操作系统的,并需要相当长的时间。

最好的问候,霍尔格


3
投票

Time::Piece::datetime()可以消除T

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

3
投票

如果你只想要一个人类可读的时间字符串,不,准确的格式:

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

版画

Mon Apr 27 10:16:19 2015

或任何配置为您的语言环境。


1
投票

简短而亲切的,没有额外的模块需要:

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

例如输出将是:2017年4月25日上午9时三十分33秒


1
投票

在许多情况下,所需要的“当前时间”是相当$ ^ T,这是自UNIX新纪元在该脚本开始运行,全部按秒计算(假设只60秒分钟)的时间。

这防止脚本的早期部分使用比一个脚本的后面部分不同日期(或夏令状态),例如,在查询条件和其他导出的值。

对于“当前时间”,变式,可以使用一个常量,也记录它是在编译时冻结:

use constant YMD_HMS_AT_START => POSIX::strftime( "%F %T", localtime $^T );

替代更高分辨率的启动时间:

0+ [ Time::HiRes::stat("/proc/$$") ]->[10]
© www.soinside.com 2019 - 2024. All rights reserved.