如何在 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 strftime
、man strptime
和 perldoc 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 转换为纪元时间?