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

时间:2009-04-07 15:17:20

标签: perl datetime date epoch

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的客户!所以要求他安装模块绝对不是一个选择。 :(

6 个答案:

答案 0 :(得分:4)

错误消息显示它无法在Perl库中找到模块Date :: Parse包含路径( @INC )。

该模块可从CPAN(Comprehensive Perl Archive Network)获得。如果您需要一个未包含在基本安装中的Perl模块,通常(> 90%)可以从CPAN(事实上的 Perl模块存档站点)获得它。

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

答案 1 :(得分:4)

你应该能够使用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。我正式讨厌夏令时。

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:0)

  

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

愚蠢的问题,但输入日期字符串的来源是什么?如果从系统中获取字符串,则代码可以更加简单。

答案 5 :(得分:0)

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