0

我正在寻找一种不那么长的方法来在 Perl 中生成以下内容:

获取当前时间(月、日和年)的代码部分。例如,如果我们在 2013 年,5 月 27 日,输出应该是 20130527

我现在如果我们使用“本地时间”,比如

$date_str = localtime;

输出格式为: Wed Jul 18 07:24:05 2001 是否还有其他有用的特殊变量?

4

4 回答 4

7

您可以strftime从标准POSIX模块中使用:

use POSIX 'strftime';
say strftime "%Y%m%d", localtime;

输出:

20130526
于 2013-05-27T01:26:58.973 回答
5

在 Perl 中,时间存储为自The Epoch以来的秒数。纪元通常是 1970 年 1 月 1 日。

这为排序和计算未来的日子提供了时间。如果您需要知道从现在起 30 天后的哪一天,您可以加上 2,592,000(30 天的秒数)。

Perl 有一个标准函数调用time,它返回自 The Epoch 以来的秒数。然后,您可以使用localtimegmtime将其转换为时间元素数组(日、年、小时等)。

出于某种奇怪的原因,Perl 从来没有一个内部函数来获取时间元素数组并将其转换回自 The Epoch 以来的秒数。然而,Perl 总是有一个标准模块来处理函数timelocaltimegm. 在 Perl 5.0 之前的日子里,你会require "timelocal.pl";. 在 Perl 5.0 中,您现在use Time::Local;.

时间元素数组和自The Epoch以来的秒数之间来回转换时间对于localtimegmtimetimelocal和函数可能有点timegm麻烦,在 Perl 5.10 中,添加了两个新Time::Piece模块Time::Seconds。这两个模块允许您使用内置的strptime和函数来格式化时间。strftimeTime::Piece

如果你有 Perl 5.10.0 或更高版本,你很容易:

use Time::Piece;

my $time = localtime; #$time is a Time::Piece object

# $time_string is in YYYYMMDD format
my $time_string = sprintf "%04d%02d%02d%", $time->year, $time->month, $time->day;

# Another way to do the above using the strftime function:
my $time_string = $time->strftime("%Y%m%d");

但是,您的程序应该使用自大纪元以来的秒数作为程序内部的时间。您应该以这种格式存储时间。您应该以这种格式计算时间,并且应该以这种格式传递所有函数的时间。

这是因为其他 Perl 模块期望这种格式的时间,更重要的是,其他将查看和维护您的代码的 Perl 开发人员期望这种格式的时间。

#Converting the time from YYYYMMDD to seconds since the epoch
my $time = Time::Piece->strptime($YYYYDDMM_time, '%Y%m%d');
my $time_since_epoch = $time->epoch;

#Converting time since the epoch to YYYYMMDD
my $time = localtime($time_since_epoch);
my $YYYYMMDD_time = $time->strftime('%Y%m%d');
于 2013-05-27T02:27:09.130 回答
4

Or, use localtime in list context:

($d,$m,$y) = (localtime)[3,4,5];
say sprintf("%4d%02d%02d", $y+1900, $m+1, $d);
于 2013-05-27T02:10:47.173 回答
1

你可以像下面这样..

use POSIX;
my $today = POSIX::strftime('%Y%m%d', localtime);
print "$today\n";

Output: 20130527

于 2013-05-27T02:30:40.683 回答