Perl将本地时间转换为Unix(纪元)时间

vaj7vani  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(179)

使用perl,我试图估计一个文件创建以来的时间。我想把本地时间转换成unix时间(纪元),然后把文件的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

我是否必须为str 2 time提供特定的日期格式?

efzxgjgh

efzxgjgh1#

你在这里做了一些奇怪的事情-localtime(time)取-历元时间(time)并将其转换为字符串。
然后你把它转换回来。
只需使用time()
或者更好的是-M,它可以告诉你一个文件在多长时间前被修改过(以天为单位,所以你必须乘上)。
例如:

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来获得固定格式:
例如:

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

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

print localtime(time) -> epoch;

而且不需要来回转换的麻烦。

dgenwo3n

dgenwo3n2#

您未请求本地时间生成标量(字符串)而不是数组。

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

($秒,$分,$小时,$月,$日,$月,$年,$月,$日,$年月日)=本地时间(时间);
...

**在标量上下文中,“localtime()”返回ctime(3)值:

$now_string =本地时间;#例如,“1994年10月13日星期四04:54:34”**

相关问题