如何在Perl中解析strftime格式的字符串?

问题描述:

我是Perl的新手,我想知道是否有与strftime()相反的功能。 看,如何在Perl中解析strftime格式的字符串?

use POSIX qw(strftime); 
print strftime("%YT%mT%d TTTT%H:%M:%S", localtime) 

我得到:2009T08T14 TTTT00:37:02。我该怎么做oposite操作?从“2009T08T14 TTTT00:37:02”字符串得到2009-08-14 00:37:02,知道格式化字符串“%YT%mT%d TTTT%H:%M:%S”?

+0

等待,我也很快地回答。你的意思是,你想要的字符串**'2009-08-14 00:37:02' **或自纪元以来的秒数? – 2009-08-13 21:53:27

+0

我想从字符串2009T08T14 TTTT00:37:02获取时间,以便将其与“有效”时间戳进行比较。 – Markus 2009-08-13 21:55:39

一种选择是使用正则表达式解析数字,然后使用Time::Local。然而,现在我明白你的问题是如何从一个strftime格式化字符串到一般的时间,这种方法肯定会很麻烦。

你在你的回答POSIX::strptime中提到,如果你的平台支持它,这是很棒的。另外,您也可以使用DateTime::Format::Strptime

#!/usr/bin/perl 

use strict; 
use warnings; 

use DateTime::Format::Strptime; 
use POSIX qw(strftime); 

my $f = "%YT%mT%d TTTT%H:%M:%S"; 
my $s = strftime($f, localtime); 

print "$s\n"; 

my $Strp = DateTime::Format::Strptime->new(
    pattern => $f, 
    locale => 'en_US', 
    time_zone => 'US/Eastern', 
); 

my $dt = $Strp->parse_datetime($s); 

print $dt->epoch, "\n"; 
print scalar localtime $dt->epoch, "\n"; 

$dtDateTime对象,所以你可以做几乎任何你想用它。

+0

好吧,但如果我有一个函数,其参数是格式化字符串(这里例如“%YT%mT%d TTTT%H:%M:%S”),但我完全不知道它。所以,我正在寻找strftime函数 的反例。 – Markus 2009-08-13 22:12:11

+0

不,只需使用DateTime :: Format :: Strptime。 – 2009-08-14 03:15:51

所以easyy

use Time::ParseDate; 
my $t = '2009T08T14 TTTT00:37:02'; 

$t =~ s/TTTT//; 
$t =~ s/T/-/g; 

$seconds_since_jan1_1970 = parsedate($t) 

我想我已经找到了解决办法:strptime($strptime_pattern, $string)

+0

我不知道http://search.cpan.org/dist/POSIX-strptime/ ...但是,它看起来像我无法在Windows上安装它,因为'strptime'在Windows上不存在。有关更多信息,请参阅http://stackoverflow.com/questions/321849/strptime-equivalent-on-windows。 – 2009-08-13 22:31:34

+0

当然,你可能不关心Windows。如果您担心可移植性,我只是提到它。 – 2009-08-13 22:35:33