2011-07-11 47 views

回答

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

my $time_str = 'Mon, 11 Jul 2011 11:45:07 +08:00'; 
# your notation of time zone 
# does not comply with relevant standards 
$time_str =~ s/([+-]\d\d):(\d\d) \z/$1$2/msx; # kill colon 

my $parser = DateTime::Format::Strptime->new(
    pattern => '%a, %d %b %Y %T %z', 
    locale => 'en', # 'Mon', 'Jul' are English 
    on_error => 'croak', 
); 

my $datetime = $parser->parse_datetime($time_str); 

# Now you have a DateTime object. To compare, 
# use the overloaded relation operators. 
# <=> operator/sort function works as well. 

if ($datetime < $a_different_datetime) { 
    say 'earlier'; 
} 
1

對於PHP,最簡單的方法是將時間字符串轉換爲strtotime()並比較整數值。最大的整數是最新的。

請注意,如果您尚未設置默認時區,某些版本的PHP會在使用日期函數時發出警告。您可以使用date_default_timezone_set("")或php.ini的date.timezone = ""list of supported timezones

+0

-1投機的答案。嘗試使用5.3.5彈出警告消息'依靠系統的時區設置是不安全的。 [...]等等。還有更多的代碼需要處理時區分析,你不會顯示。我不認爲這實際上是由PHP標準庫覆蓋的。 – daxim

+0

該警告只是說明它使用默認的時區設置進行日期轉換。這與轉換問題無關,因爲時區在字符串中明確給出。如果你把它作爲輸入,爲什麼系統的時區很重要?我想你將不得不問你的PHP 5.3.5。我的PHP可能已經將配置配置爲其配置的一部分,就像所有正確的PHP安裝應該一樣。除了假設人們實際配置PHP安裝之外,我的回答中沒有任何猜測。 – Naltharial

+0

好吧,這使我的批評無效。編輯您的答案,以便我可以更改我的投票;也許添加一個代碼示例並更改連接模式? – daxim

0

你可以嘗試的strtotime()對你有時間戳。那麼只需使用常規比較器比較數字即可。

1

我用Date::Manip在Perl此:

use Date::Manip; 

my $datestr1 = "Mon, 11 Jul 2011 11:45:07 +08:00"; 
my $datestr2 = "Mon, 18 Jul 2011 11:45:07 +08:00"; 

my $date1 = new Date::Manip::Date; 
my $date2 = $date1->new_date; 
$date1->parse($datestr1); 
$date2->parse($datestr2); 

my $result = $date1->cmp($date2); # => -1, 0, 1 

print $result, "\n";