2009-08-25 192 views
0

任何人都可以幫助我如何將這種日期格式「Mon,24 Aug 2009 17:00:44 +0800」轉換成這樣的東西,「2009-08-24 17:00:44」在Perl中?我一直在CPAN瀏覽模塊,但仍然無法找到我想要的內容。第一種格式是使用Mail :: POP3Client從電子郵件帳戶中檢索的。另一個來自數據庫中的查詢。我的目標是比較這兩個日期,但如果它們的格式不同,它將無法工作。任何建議請問? =)如何比較Perl中不同格式的日期?

回答

1

我會用Date::Calc

分割字符串來得到所需的值,並使用解碼_月(「八月」)

use strict; 
use warnings; 
use Date::Calc qw(:all); 

my $datetime = 'Mon, 24 Aug 2009 17:00:44 +0800'; 

# get each part 
my (undef, $day, $month_text, $year, $time, undef) = split('/,?\s/', $datetime); 

my $month = Decode_Month($month_text); 

# put together in wanted format 
my $newdatetime = sprintf("%04d-%02d-%02d $time", $year, $month, $day); 
+1

split /,?\ s /避免前面的s /// – larelogio 2009-08-25 11:37:57

8

我會使用DateTime::Format::Strptime將日期轉換成DateTime對象,然後要求它提供所需的日期表示形式。例如: -

my $parser = DateTime::Format::Strptime->new(pattern => '%a, %d %b %Y %T %z'); 
my $dt = $parser->parse_datetime($original_timestamp); 

# Postgres-format timestamp for db storage 
my $pg_timestamp = DateTime::Format::Pg->format_datetime($dt); 

# Epoch timestamp for if I'm going to do the comparison in code 
my $epoch = $dt->epoch; 
0

如果您確信您的POP3客戶端上的時間戳格式不會改變,那麼我會建議轉換格式的數據庫查詢本身。您沒有提及您使用的數據庫,但是我使用的所有數據庫(Oracle,PostgreSQL,MySQL)都具有在您的select語句中爲您提供任何格式的功能。

如果你告訴我們你正在使用什麼數據庫,我可以告訴你什麼是時間戳格式化函數。