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

4

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),报错如下:

Can't locate Date/Parse.pm in @INC (@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 .) at try1.pl line 3. BEGIN failed--compilation aborted at try1.pl line 3.

这是怎么回事?如何解决?

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


顺便问一下,为什么你在处理 $date1 时要使用 chomp 函数?它里面没有换行符啊。 - Telemachus
6个回答

5
您应该能够使用Perl核心模块Time::Piece来完成此操作,该模块在Perl5.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行。 - pavanlimo
1
根据Module::CoreList的记录,Time::Piece直到5.9.5才成为核心模块,它是Perl 5.10开发系列的一部分。虽然它可以在5.8版本中使用,但并未随之发布。(OS X可能会额外包含它。) - cjm
不,实际上你是对的。我没有仔细考虑我正在检查哪些核心模块。它在5.8中不存在。对于我的错误深感抱歉。 - Telemachus

5
错误信息显示在你的Perl库包含路径(@INC)中找不到模块Date::Parse。这个模块可以从CPAN(综合Perl存档网络)获取。如果你需要一个未包含在基本安装中的Perl模块,通常(>90%)可以从CPAN获取,它是事实上的Perl模块归档站点。
使用CPAN模块(CPAN模块用于从CPAN检索模块)文档回答了你的问题。我建议从FAQ第5个问题“我不是root用户,如何在个人目录中安装模块?”开始阅读。

4

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


3
你确定那是正确的错误信息吗?Date::ParseTime::ParseDate是完全独立的模块。它们提供类似的功能,但彼此之间没有使用。
你可以使用Module::CoreList获取随5.8.8一起发布的模块列表。我不知道Solaris 10是否包含其他附加模块。
你可能需要从适当的模块中复制代码并将其粘贴到脚本中。(请记住,Perl文件可能具有多个package语句。)

我基本上是在尝试这里提供的解决方案: https://dev59.com/93RC5IYBdhLWcg3wFdFx我一直收到模块不存在的类似错误消息,因此可能在此处粘贴了错误的内容。对此很抱歉。但问题仍然存在 :| - pavanlimo

1

虽然这是一个旧的帖子,但这可能会帮助到遇到同样问题的人。使用标准的Time::Local模块中的timelocal函数。请参见perlfaq 4


0
Solaris 10 对我似乎不太友好。我正在尝试运行一个简单的脚本来接受日期并返回该日期的时代。
有点傻的问题,但输入日期字符串的来源是什么?如果该字符串是从系统中获取的,那么您的代码可以更加简单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接