2009-08-13 65 views
4

我是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

回答

7

一種選擇是使用正則表達式解析數字,然後使用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

0

所以easyy

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

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

$seconds_since_jan1_1970 = parsedate($t) 
2

我想我已經找到了解決辦法: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