Perl将localtime转换为unix(epoch)时间

amp*_*ino 2 perl date epoch unix-timestamp

使用perl,我试图估计自文件创建以来的时间.我想将本地时间转换为unix时间(epoch),然后获取文件的unix时间并减去.

我面临的问题是,当我将localtime转换为unixtime时,它转换不正确!

my $current = str2time (localtime(time));
print $current;
Run Code Online (Sandbox Code Playgroud)

我得到的结果是

2768504400 = Sun, 23 Sep 2057 21:00:00 GMT
2421349200 = Sun, 23 Sep 2046 21:00:00 GMT
Run Code Online (Sandbox Code Playgroud)

我是否必须使用特定日期格式提供str2time?

Sob*_*que 7

你在这里做了一些奇怪的事情 - localtime(time)接受 - 纪元时间(time)并将其转换为字符串.

然后你把它转换回来.

只是用 time()

或者可能更好-M,它告诉你多久以前修改了一个文件.(在几天内,所以你必须增加).

例如:

my $filename = "sample.csv";
my $modification = -M $filename;
print $modification * 84600;
Run Code Online (Sandbox Code Playgroud)

但是如果你真的想花时间再把它转换回来 - 你需要看看如何localtime(time)返回结果.

如果你这样做:

print localtime(time);
Run Code Online (Sandbox Code Playgroud)

你得到:

5671624811542661
Run Code Online (Sandbox Code Playgroud)

因为localtime正在列表上下文中进行评估,因此返回值数组.(无需解析即可使用).

 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
                                                localtime(time);
Run Code Online (Sandbox Code Playgroud)

如果在标量上下文中执行此操作,则返回表示时间的字符串:

print "".localtime(time);
Run Code Online (Sandbox Code Playgroud)

得到:

Thu Sep 24 16:09:33 2015
Run Code Online (Sandbox Code Playgroud)

但请注意 - 根据您当前的区域设置,这可能会有所不同.这可能就是为什么str2time做一些奇怪的事情 - 因为它对那些并不总是适用的格式做出了某些假设.最大的问题是:

当月份和日期都在日期中指定为数字时,它们总是被解析,假设月份数字在日期之前.这是美国约会中常用的格式.

您可能会更好地使用Time::Piecestrftime获得固定格式:

例如

use Time::Piece;
print localtime(time) -> strftime ( "%Y-%m-%d %H:%M:%S" );
Run Code Online (Sandbox Code Playgroud)

注意 - Time::Piece重载localtime使您可以(相当)透明地使用它.当然,那么你也可以这样做:

print localtime(time) -> epoch;
Run Code Online (Sandbox Code Playgroud)

并且没有来回转换的大惊小怪.