2016-07-01 42 views
0

我需要將下面的字符串轉換爲DateTime對象,所以我可以對它們進行比較:如何將不同格式的兩個日期轉換爲DateTime對象,以便我可以比較它們?

2016-06-30T09:00:00-04:00 
2016-07-01T15:37:25 

兩個對象應使用EST時區。我怎樣才能做到這一點?

+1

你的意思是你要刪除的時區偏移? ('-04:00'在你的第一個字符串) – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot是的,實際上我需要刪除(-4.00),並且「2016-06-30T09:00:00-04:00」類型的字符串,我需要轉換爲DateTime對象! – user3784251

+0

DateTime對象應使用哪個時區? – ThisSuitIsBlackNot

回答

2

首先,EST用於指代多個不同的時區偏移量。據推測,你的意思是UTC-05:00

其次,如果要執行日期時間算術,很少有人想要處理偏移;人們總是希望與地理位置相關的時區(例如America/New_York)。 America/New_York將是下面使用的合適選擇,但我使用更靈活的local來代替。

use strict; 
use warnings; 
use feature qw(say); 

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

my $format1 = DateTime::Format::Strptime->new(
    pattern => "%Y-%m-%dT%H:%M:%S%Z", 
    on_error => "croak", 
); 

my $format2 = DateTime::Format::Strptime->new(
    pattern => "%Y-%m-%dT%H:%M:%S", 
    time_zone => "local", 
    on_error => "croak", 
); 

my $dt1 = $format1->parse_datetime('2016-06-30T09:00:00-04:00'); 
my $dt2 = $format2->parse_datetime('2016-07-01T15:37:25'); 

然後,你可以做任何你想做的事情。您提到您想要比較它們,可以使用數字比較運算符完成(例如$dt1 < $dt2)。

下面的例子中的時間戳轉換爲RFC3339的時間戳(由互聯網標準中使用的時間戳格式):

$dt1->set_time_zone("UTC"); 
say "dt1: " . $dt1->strftime("%Y-%m-%dT%H:%M:%SZ"); 

$dt2->set_time_zone("UTC"); 
say "dt2: " . $dt2->strftime("%Y-%m-%dT%H:%M:%SZ"); 
+0

這給出了一個錯誤,如「我不認識時區8.在trydate.pl第21行」。當秒數爲00以外時,例如:2016-07-01T16:32:08-04:00。爲什麼是這樣?如何放棄這個錯誤? – user3784251

+0

不,'$ format1-> parse_datetime('2016-07-01T16:32:08-04:00')'不會產生任何錯誤。我不認爲這就是你實際通過的。 – ikegami

+0

'my $ format1 = DateTime :: Format :: Strptime-> new( pattern =>「%Y-%m-%dT%H:%M:%S%Z」, on_error =>「croak」, ); my $ dt1 = $ format1-> parse_datetime('2016-07-01T16:32:08-04:00'); $ dt1-> set_time_zone(「EST」); print「dt1:2016-07-01T16:32:08-04:00」。 $ dt1-> strftime(「%Y-%m-%dT%H:%M:%SZ」)。「\ n \ n」;' – user3784251

相關問題