1970 年格式化之前的 Perl 纪元时间

Posted

技术标签:

【中文标题】1970 年格式化之前的 Perl 纪元时间【英文标题】:Perl epoch time before 1970 formatting 【发布时间】:2012-09-27 23:01:09 【问题描述】:

我在 Perl 中格式化和处理 1970 年 1 月 1 日之前的日期时遇到问题,日期返回为负整数:

my $time=timelocal(0, 0, 0, 1, 1, 1969);
print "$time\n"; 
$theTime = localtime($time); 
print "the time is good: $theTime\n\n";

如何在 Perl 中处理纪元之前的日期,在 unix 和 windows 上都有相同的问题 Perl 5.8.8。 php显示日期正常没有问题。

【问题讨论】:

01/01/1970 是 EPOCH 日期格式的零时间 我发现 VB 模块适用于 1970 年之前的日期,但它需要时间才能转换为 Perl。 UNIX Epoch Timestamp via API (+ Other Time-Related Subs) (modCnTime.bas) '# By: Nick Campbeln '# '# Revision History: '# 1.1 (Apr 2, 2003): '# added DateSerialToTimestamp() 和 isDaylightSavings( ),已在 TimestampToDate() 上完成工作 '# Contributed to PSC.com (Apr 19, 2003) '# 1.0 (Aug 26, 2002): '# Initial Release '# '# Copyright © 2002-2003 Nick Campbeln (opensource@nick .campbeln.com) 为了让问题更清楚,我知道纪元从 1970 年 1 月 1 日开始,并且我确实得到了纪元之前日期的时间戳负整数,问题是在 Perl 中格式化负日期,即像locatime(-xxxxxxx)这样的函数会返回空值。 不,它没有:perl -E 'say scalar localtime(-1)' Thu Jan 1 00:59:59 1970。你用的是什么版本的 Perl? Time::Local docs 说:在旧版本的 perl 上,POSIX 标准未正式支持的负纪元 (time_t) 值已知不适用于某些系统。这些包括 MacOS (pre-OSX) 和 Win32。在支持负纪元值的系统上,该模块应该能够处理纪元开始之前的日期,低于系统的 time_t 最小值。 【参考方案1】:

您是否尝试过使用DateTime?

【讨论】:

是的,花了几天时间在 cpan 和 perl 搜索上,都说 time_t 的大小在不同的系统上有所不同,并且都声称它们不支持纪元日期之前的日期。您是否有使用 DateTime 或任何其他模块甚至没有模块代码来处理纪元之前的日期的具体示例。谢谢【参考方案2】:

如果perl 打印一个负整数,这是好的行为,因为 01/01/1970 是这种日期格式的零日。在https://en.wikipedia.org/wiki/Unix_epoch

上搜索否定这个词

shell 中的一个例子:

$ date -d "1957-10-04T00:00:00Z" +%s
-386380800

这是正确的。

【讨论】:

我没有明白这一点,Time::Local 函数 localtime 已经返回了 1970 年之前日期的负数,我需要将此负数传递给 localtime 或其他函数以返回格式化日期时间数组。当前 locatime 为负时间戳返回空值。【参考方案3】:

我需要将此负数传递给本地时间或其他一些函数以返回格式化的日期时间数组。

好吧,是什么阻止了你?

# ActivePerl on Windows
>perl -E"say ''.localtime(-386380800)"
Thu Oct  3 20:00:00 1957

# Linux
$ perl -E'say "".localtime(-386380800)'
Thu Oct  3 16:00:00 1957

# Cygwin
$ perl -E'say "".localtime(-386380800)'
Thu Oct  3 16:00:00 1957

【讨论】:

这确实适用于带有 Perl 5.8.8 的 Windows 或任何未使用 64 位支持编译的 Perl。您的代码是 Perl 5.10 或更高版本,因为它具有 say 函数而不是 print。

以上是关于1970 年格式化之前的 Perl 纪元时间的主要内容,如果未能解决你的问题,请参考以下文章

PHP日期格式化

如何在 python 中将 1970 年前的日期转换为纪元? [复制]

Perl的timelocaltime和gmtime函数

将纪元时间转换为时间戳颤动

将 999 年之前的时间转换为纪元

为啥 1/1/1970 是“纪元时间”?