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

时间:2015-09-24 14:40:53

标签: perl date unix-timestamp epoch

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

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

my $current = str2time (localtime(time));
print $current;

我得到的结果是

2768504400 = Sun, 23 Sep 2057 21:00:00 GMT
2421349200 = Sun, 23 Sep 2046 21:00:00 GMT

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

2 个答案:

答案 0 :(得分:6)

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

然后你把它转换回来。

只需使用time()

即可

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

e.g:

my $filename = "sample.csv";
my $modification = -M $filename;
print $modification * 84600;

但如果您真的想花时间再将其转换回来 - 您需要查看localtime(time)如何返回结果。

如果你这样做:

print localtime(time);

你得到:

5671624811542661

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

 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
                                                localtime(time);

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

print "".localtime(time);

给出:

Thu Sep 24 16:09:33 2015

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

  

如果月份和日期都在日期中指定为数字,则始终会解析它们,假设月份数字在日期之前。这是美国约会中常用的格式。

您可能最好使用Time::Piecestrftime获取固定格式:

e.g。

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

注意 - Time::Piece重载localtime,因此您可以(相当)透明地使用它。当然,你可以做:

print localtime(time) -> epoch;

没有来回转换的大惊小怪。

答案 1 :(得分:1)

您错过了请求localtime生成标量(字符串)而不是数组。

use Date::Parse;
my $current = str2time (scalar(localtime(time)));
print $current, "\n";
print scalar(localtime($current)),"\n";

perldoc -f localtime

  

将time函数返回的时间转换为9个元素               列出当地时区的时间分析。通常               用法如下:
                  #0 1 2 3 4 5 6 7 8
                  ($ sec,$ min,$ hour,$ mday,$ mon,$ year,$ wday,$ yday,$ isdst)= localtime(time);
  ...
             在标量上下文中," localtime()"返回ctime(3)值:
                 $ now_string = localtime; #eg," Thu Oct 13 04:54:34 1994"