【问题标题】:How do I convert a date into epoch time in Perl?如何在 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?它没有换行符。

标签: perl datetime date epoch


【解决方案1】:

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

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

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

【讨论】:

  • 我基本上是在尝试这里提供的解决方案stackoverflow.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

        【讨论】:

          猜你喜欢
          • 2018-04-24
          • 2011-12-06
          • 2012-09-06
          • 2019-09-19
          • 2017-02-28
          • 1970-01-01
          • 2012-11-08
          • 2019-01-15
          • 2011-12-13
          相关资源
          最近更新 更多