我正在寻找一种不那么长的方法来在 Perl 中生成以下内容:
获取当前时间(月、日和年)的代码部分。例如,如果我们在 2013 年,5 月 27 日,输出应该是 20130527
我现在如果我们使用“本地时间”,比如
$date_str = localtime;
输出格式为: Wed Jul 18 07:24:05 2001 是否还有其他有用的特殊变量?
我正在寻找一种不那么长的方法来在 Perl 中生成以下内容:
获取当前时间(月、日和年)的代码部分。例如,如果我们在 2013 年,5 月 27 日,输出应该是 20130527
我现在如果我们使用“本地时间”,比如
$date_str = localtime;
输出格式为: Wed Jul 18 07:24:05 2001 是否还有其他有用的特殊变量?
在 Perl 中,时间存储为自The Epoch以来的秒数。纪元通常是 1970 年 1 月 1 日。
这为排序和计算未来的日子提供了时间。如果您需要知道从现在起 30 天后的哪一天,您可以加上 2,592,000(30 天的秒数)。
Perl 有一个标准函数调用time
,它返回自 The Epoch 以来的秒数。然后,您可以使用localtime
或gmtime
将其转换为时间元素数组(日、年、小时等)。
出于某种奇怪的原因,Perl 从来没有一个内部函数来获取时间元素数组并将其转换回自 The Epoch 以来的秒数。然而,Perl 总是有一个标准模块来处理函数timelocal
和timegm
. 在 Perl 5.0 之前的日子里,你会require "timelocal.pl";
. 在 Perl 5.0 中,您现在use Time::Local;
.
时间元素数组和自The Epoch以来的秒数之间来回转换时间对于localtime
、gmtime
、timelocal
和函数可能有点timegm
麻烦,在 Perl 5.10 中,添加了两个新Time::Piece
模块Time::Seconds
。这两个模块允许您使用内置的strptime
和函数来格式化时间。strftime
Time::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');
Or, use localtime in list context:
($d,$m,$y) = (localtime)[3,4,5];
say sprintf("%4d%02d%02d", $y+1900, $m+1, $d);
你可以像下面这样..
use POSIX;
my $today = POSIX::strftime('%Y%m%d', localtime);
print "$today\n";
Output: 20130527