我正在寻找一种在Perl中生成以下内容的不太长的方法:
获取当前时间(月,日和年)的代码的一部分。例如,如果我们在2013年5月27日,那么输出应该是20130527
我现在如果我们使用“localtime”,比如
$date_str = localtime;
输出格式为:Wed Jul 18 07:24:05 2001 是否有其他特殊变量可用?
答案 0 :(得分:7)
答案 1 :(得分:5)
在Perl中,存储的时间是自 The Epoch 以来的秒数。 时代通常是1970年1月1日。
这使得排序和计算未来日期变得更好。如果您需要知道从现在开始30天的日期,您可以添加2,592,000(30天内的秒数)。
Perl有一个名为time
的标准函数,它返回自The Epoch以来的秒数。然后,您可以使用localtime
或gmtime
将其转换为时间元素数组(日,年,小时等)。
出于某些奇怪的原因,Perl从来没有内部函数来获取时间元素数组并将其转换回自The Epoch以来的秒数。但是,Perl总是有一个标准模块,它使用函数timelocal
和timegm
执行此操作。在5.0之前的Perl日,你会require "timelocal.pl";
。在Perl 5.0中,您现在use Time::Local;
。
在localtime
,gmtime
,{{ 1}}和timelocal
函数,在Perl 5.10中,添加了两个新模块Time::Piece
和Time::Seconds
。这两个模块允许您使用timegm
中内置的strptime
和strftime
函数格式化时间。
如果你有Perl 5.10.0或更高版本,你可以轻松实现:
Time::Piece
但是,您的程序应该使用自 The Epoch 以来的秒数作为程序内部时间。您应该以这种格式存储时间。您应该以这种格式计算时间,并且您应该以这种格式为所有函数传递时间。
这是因为其他Perl模块需要这种格式的时间,更重要的是,其他将要查看和维护代码的Perl开发人员需要这种格式的时间。
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");
答案 2 :(得分:4)
或者,在列表上下文中使用localtime:
($d,$m,$y) = (localtime)[3,4,5];
say sprintf("%4d%02d%02d", $y+1900, $m+1, $d);
答案 3 :(得分:1)
你可以像下面这样做..
use POSIX;
my $today = POSIX::strftime('%Y%m%d', localtime);
print "$today\n";
Output: 20130527