如何在 Perl 中将日期转换为纪元时间?

Posted

技术标签:

【中文标题】如何在 Perl 中将日期转换为纪元时间?【英文标题】:How do I convert a date into epoch time in Perl? 【发布时间】:2010-10-18 02:21:22 【问题描述】:

Solaris 10 似乎不太喜欢我。 我正在尝试运行一个简单的脚本来接受日期并返回该日期的纪元:

#!/usr/bin/perl -w
use strict;
use Time::ParseDate;

my $date1 = "Mon Mar 27 05:54:08 CDT 2009";

#Convert to seconds since start of epoch
my $time1 = parsedate($date1);
print $time1;

在 RHEL 机器上工作得很好,但在 Solaris(两者都有 5.8.8 Perl)上搞砸了,给出以下错误消息。

在@INC 中找不到 Date/Parse.pm(@INC 包含:/usr/perl5/5.8.4/lib/sun4-solaris-64int /usr/perl5/5.8.4/lib /usr/perl5 /site_perl/5.8.4/sun4-solaris-64int /usr/perl5/site_perl/5.8.4 /usr/perl5/site_perl /usr/perl5/vendor_perl/5.8.4/sun4-solaris-64int /usr/perl5/vendor_perl /5.8.4 /usr/perl5/vendor_perl .) 在 try1.pl 第 3 行。 BEGIN 失败——编译在 try1.pl 第 3 行中止。

这里有什么问题?...如何纠正这个问题?

哦.. 差点忘了,我不能在这个 Solaris 机器上更改/安装/修改任何东西,这个脚本需要发送给运行 Solaris 10 的客户!所以让他安装一个模块绝对不是一个选择。 :(

【问题讨论】:

顺便问一下,你为什么要吃$date1?它没有换行符。 【参考方案1】:

您确定这是正确的错误消息吗? Date::Parse 是一个完全独立于 Time::ParseDate 的模块。它们提供类似的功能,但不能相互使用。

您可以使用Module::CoreList 获取5.8.8 附带的模块列表。我不知道 Solaris 10 是否包含任何其他模块。

您可能必须从合适的模块中复制内容并将其粘贴到您的脚本中。 (请记住,一个 Perl 文件可能有多个 package 语句。)

【讨论】:

我基本上是在尝试这里提供的解决方案***.com/questions/411740/… 我收到了类似的模块不存在的错误消息,因此可能在这里粘贴了错误的消息。对不起。但问题依然存在:|【参考方案2】:

错误消息说它在您的 Perl 库包含路径 (@INC) 中找不到模块 Date::Parse。

该模块可从CPAN(综合 Perl 存档网络)获得。如果您需要基本安装中未包含的 Perl 模块,通常 (>90%) 可从 CPAN(de facto Perl 模块存档站点)获得。

CPAN 模块(CPAN 模块用于从 CPAN 中检索模块)文档解决了您的问题。我建议从FAQ 问题 5 开始,“我不是 root,如何在个人目录中安装模块?”

【讨论】:

【参考方案3】:

你应该可以使用 Time::Piece 来做到这一点,它是 Perl 5.10 的核心(这里更正:它不是 5.8 的核心)。这是我机器上的一个例子。请参阅man strftimeman strptimeperldoc Time::Piece。在Time::Piece 文档中,您要检查日期解析部分。 (转换细节在 Solaris 机器上可能有所不同。我现在在 OS X 上工作。)

#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;

my $date = Time::Piece->strptime("Tue Apr 7 12:46:59 2009",
  "%a %b %e %H:%M:%S %Y");
my $epoch_date = $date->epoch;

print "$epoch_date\n";

编辑:解析器在 CDT 上阻塞(%Z 似乎无法识别它),因此您可能需要分两步执行此操作。以下对我有用:

my $string = "Mon Mar 27 05:54:08 CDT 2009";
$string =~ s/CDT/-0500/; # Replace timezone with offset from UTC
my $date = Time::Piece->strptime($string, "%a %b %e %H:%M:%S %z %Y");
my $epoch_date = $date->epoch;

print "$epoch_date\n";

但是,现在我们遇到了 CDT => -0500 与 CST => -0600 的额外问题。我正式讨厌夏令时。

【讨论】:

消息在 RHEL 和 Solaris 上无法在 @INC 中找到 Time/Piece.pm(@INC 包含:/usr/lib /usr/lib/site_perl /usr/local/sendmail/perl-1.3 /lib/5.8.3/i686-linux /usr/local/sendmail/perl-1.3/lib/site_perl/5.8.3/i686-linux /usr/local/sendmail/perl-1.3/lib/site_perl .) 在 try2 .pl 第 4 行。 根据 Module::CoreList,Time::Piece 直到 5.9.5 才成为核心模块,这是 Perl 5.10 之前的开发系列的一部分。它适用于 5.8,但它没有随它一起提供。 (OS X 可能将它作为额外的。) 不,实际上,你是对的。我对检查哪些核心模块不够小心。它在 5.8 中不存在。为错误道歉。【参考方案4】:

由于您需要将程序发送给不会为您安装模块的客户,因此您需要使用 PAR::Packer 创建包含所有依赖项(或仅使用核心模块)的本机可执行文件。

【讨论】:

【参考方案5】:

Solaris 10 似乎不太喜欢我。我正在尝试运行一个简单的脚本来接受日期并返回该日期的纪元

愚蠢的问题,但输入日期字符串的来源是什么?如果字符串是从系统中获取的,那么您的代码会简单得多。

【讨论】:

【参考方案6】:

旧线程,但这可能会帮助有同样问题的人。使用标准 Time::Local 模块中的 timelocal 函数。见perlfaq 4

【讨论】:

以上是关于如何在 Perl 中将日期转换为纪元时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中将 dd/mm/yyyy 转换为纪元时间?

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

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

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

如何在python中将日期转换为纪元时间[重复]

如何在javascript中将给定的日期和时间转换为纪元时间?