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

Posted

技术标签:

【中文标题】Perl 将本地时间转换为 unix(纪元)时间【英文标题】:Perl convert localtime to unix (epoch) time 【发布时间】:2015-12-22 05:27:12 【问题描述】:

使用 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

我必须以特定日期格式输入 str2time 吗?

【问题讨论】:

请参阅search.cpan.org/~rse/lcwa-1.0.0/lib/lwp/lib/HTTP/… 了解支持的格式列表。 为什么不直接使用time? 您确定要使用文件的unix时间吗?为什么不使用 perl 的 stat 函数来获取文件的最后修改日期/时间并将苹果与苹果进行比较?就像perl -e 'print("LMD: ",scalar(localtime((stat("README.md"))[9])),"\nNOW: ",scalar(localtime(time())),"\n")',产生:LMD: Thu Sep 17 12:08:58 2015NOW: Thu Sep 24 10:58:38 2015 str2time 不是内置函数,但有几个 CPAN 模块具有该名称。你用的是哪一个? ..请删除我.. 【参考方案1】:

你在这里做了一些奇怪的事情 - 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;

而且不用大惊小怪地来回转换。

【讨论】:

use Time::Piece; localtime(time)->strftime("%Y-%m-%d %H:%M:%S") 是编写use POSIX qw( strftime ); strftime("%Y-%m-%d %H:%M:%S", localtime(time)) 的昂贵方式 使用时间::件;我的 $time = Time::Piece->new;我的 $current = $time->localtime;我的 $current2 = $time->localtime->epoch; $current 是 Thu Sep 24 19:26:19 2015 $current2 是 1443111979 ,等于 Thu, 24 Sep 2015 16:26:19 GMT 为什么会丢失时区?【参考方案2】:

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

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

perldoc -f localtime

将时间函数返回的时间转换为 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 = 本地时间; # 例如,“Thu Oct 13 04:54:34 1994”

【讨论】:

以上是关于Perl 将本地时间转换为 unix(纪元)时间的主要内容,如果未能解决你的问题,请参考以下文章

Perl 将自纪元以来的微秒转换为本地时间

在 Windows 上的 perl 中将纪元转换为本地时间

在perl中将日期转换为纪元的最佳方法[关闭]

Unix 纪元时间戳在 Python 中转换为 UTC 时区

如何使用 Perl 将纪元时间转换为 UTC 时间?

如何在 Perl 中将纪元时间转换为正常时间?