Spo*_*ser 34
如果您正在使用DateTime模块,则可以在DateTime对象上调用epoch()方法,因为这就是您认为的unix时间.
使用DateTimes可以轻松地从纪元转换为日期对象.
另外,localtime和gmtime会将一个纪元转换为一个包含日月和年的数组,而来自Time :: Local模块的 timelocal和timegm将反过来,转换一组时间元素(秒,分钟,......,天) ,几个月等)进入一个时代.
dre*_*ves 21
这是获得unix时间的最简单方法:
use Time::Local;
timelocal($second,$minute,$hour,$day,$month-1,$year);
Run Code Online (Sandbox Code Playgroud)
请注意参数的相反顺序,1月是0月.有更多选项,请参阅CPAN中的DateTime模块.
至于解析,请参阅CPAN中的Date :: Parse模块.如果你真的需要对日期解析感兴趣,Date :: Manip可能会有所帮助,虽然它自己的文档警告你远离它,因为它带有很多包袱(它知道像常见的商业假期等)和其他解决方案要快得多.
如果你碰巧知道你将要解析的日期/时间的格式,那么一个简单的正则表达式可能就足够了,但你可能最好使用适当的CPAN模块.例如,如果您知道日期将始终采用YMDHMS顺序,请使用CPAN模块DateTime :: Format :: ISO8601.
对于我自己的参考,如果没有别的,下面是我用于应用程序的函数,我知道日期将始终以YMDHMS顺序,全部或部分"HMS"部分是可选的.它接受任何分隔符(例如,"2009-02-15"或"2009.02.15").它返回相应的unix时间(自1970-01-01 00:00:00 GMT以来的秒数)或-1如果它无法解析它(这意味着你最好确定你永远不会合法地需要解析日期1969- 12-31 23:59:59)它还假设两位数年份XX到"69"表示"20XX",否则"19XX"(例如,"50-02-15"表示2050-02-15但"75-02-15"表示1975- 02-15).
use Time::Local;
sub parsedate {
my($s) = @_;
my($year, $month, $day, $hour, $minute, $second);
if($s =~ m{^\s*(\d{1,4})\W*0*(\d{1,2})\W*0*(\d{1,2})\W*0*
(\d{0,2})\W*0*(\d{0,2})\W*0*(\d{0,2})}x) {
$year = $1; $month = $2; $day = $3;
$hour = $4; $minute = $5; $second = $6;
$hour |= 0; $minute |= 0; $second |= 0; # defaults.
$year = ($year<100 ? ($year<70 ? 2000+$year : 1900+$year) : $year);
return timelocal($second,$minute,$hour,$day,$month-1,$year);
}
return -1;
}
Run Code Online (Sandbox Code Playgroud)
$ENV{TZ}="GMT";
POSIX::tzset();
$time = POSIX::mktime($s,$m,$h,$d,$mo-1,$y-1900);
Run Code Online (Sandbox Code Playgroud)
我知道这是一个老问题,但我想我会提供另一个答案.
Time::Piece 是Perl 5.9.5的核心
这允许通过该strptime方法以任意格式解析时间.
例如:
my $t = Time::Piece->strptime("Sunday 3rd Nov, 1943",
"%A %drd %b, %Y");
Run Code Online (Sandbox Code Playgroud)
有用的部分是 - 因为它是一个重载的对象,你可以用它进行数值比较.
例如
if ( $t < time() ) { #do something }
Run Code Online (Sandbox Code Playgroud)
或者,如果您在字符串上下文中访问它:
print $t,"\n";
Run Code Online (Sandbox Code Playgroud)
你得到:
Wed Nov 3 00:00:00 1943
Run Code Online (Sandbox Code Playgroud)
有一堆访问器方法允许一些其他有用的基于时间的变换.https://metacpan.org/pod/Time::Piece
小智 6
use Date::Manip;
$string = '18-Sep-2008 20:09'; # or a wide range of other date formats
$unix_time = UnixDate( ParseDate($string), "%s" );
Run Code Online (Sandbox Code Playgroud)
编辑:
Date :: Manip很大很慢,但解析非常灵活,而且它是纯粹的perl.如果您在编写代码时匆忙,请使用它,并且您知道在运行代码时不会匆忙.
例如,在启动时使用它来解析命令行选项,但不要使用它在繁忙的Web服务器上解析大量数据.
见作者的评论.
(感谢下面第一条评论的作者)