2011-09-20 99 views
27

我知道DateTime Perl模塊,和許多DateTime::Format::模塊來解析特定種類的日期/時間格式。然而,給出一些日期/時間字符串的例子,我怎麼能找出(在編碼/設計時,在運行時而不是)我應該使用哪個特定的模塊?如何在Perl中將字符串解析爲DateTime對象?

例如,我想分析如字符串:October 28, 2011 9:00 PM PDT

是否有一個清單某處的最常見的日期/時間格式,我可以看看這件事,發現這將是最合適的模塊?

我也知道一些模塊試圖在運行時「猜測」每個給定字符串的格式並盡力而爲。但是,對於敏感應用程序,我想在設計應用程序時首先確定格式(儘可能嚴格),然後使用一個模塊,它會在字符串與指定格式不匹配時發出警告。

我應該怎麼辦?

回答

36

DateTime::Format::Strptime需要的日期/時間的字符串和它們解析成日期時間對象。

#!/usr/bin/perl 

use strict; 
use warnings; 

use DateTime::Format::Strptime; 

my $parser = DateTime::Format::Strptime->new(
    pattern => '%B %d, %Y %I:%M %p %Z', 
    on_error => 'croak', 
); 

my $dt = $parser->parse_datetime('October 28, 2011 9:00 PM PDT'); 

print "$dt\n"; 

該模式中使用的字符序列是POSIX標準。詳情請看'man strftime'。

+0

謝謝!這就是爲什麼最終結束了。儘管如此,我還是希望看到一些常用的或標準的日期格式(ISO,RFC),以檢查我的某些特定字符串是否適合其中的任何字符串。 –

+0

在http://datetime.perl處有(過期的)DateTime模塊列表(其中包含許多DT :: Format模塊)。org/wiki/datetime/page/Modules –

+0

不需要很精確地指定格式 – MikeKulls

14

看看Date::Parse模塊,即str2time()功能。它支持大多數常用格式。

實施例:

use Date::Parse; 
use DateTime; 

my $str = "Tue, 20 Sep 2011 08:51:08 -0500"; 
my $epoch = str2time($str); 
my $datetime = DateTime->from_epoch(epoch => $epoch); 
+1

謝謝,但這個解析日期正是*不*我想要做的。我不希望函數猜測字符串的格式;我希望能夠指定代碼應該準確預期的格式。 –

+0

不錯,這正是我想要做的:-)我會推薦一種格式,但如果有人改變它,那麼這將是最好的努力。 – MikeKulls

+0

其實這個模塊看起來不太好。它解決2015年4月15日至1429060633,但15/apr/2015年至1429020000.很難想象它甚至在這裏做什麼,因爲這是11.28小時差異解析日期。應該沒有時間組件。 – MikeKulls

27

我傾向於使用Time::Piece,因爲它是自版本5.10以來的標準Perl模塊集的一部分。

你不能打敗它的能力parse date strings。 看看DateTime::Locale

use DateTime::Locale 
my $locale = DateTime::Locale->load('DE_de'); 

The following methods return strings appropriate for the DateTime->format_cldr() method:

$locale->date_format_full() 
$locale->date_format_long() 
$locale->date_format_medium() 
$locale->date_format_short() 
$locale->date_format_default() 
$locale->time_format_full() 
$locale->time_format_long() 
$locale->time_format_medium() 
$locale->time_format_short() 
$locale->time_format_default() 
$locale->datetime_format_full() 
$locale->datetime_format_long() 
$locale->datetime_format_medium() 
$locale->datetime_format_short() 
$locale->datetime_format_default() 

my $time = Time::Piece->strptime(
     "October 28, 2011 9:00 PM PDT", 
     "%B %d, %Y %r %Z"); 
+0

不幸的是,它不是5.8版本中標準Perl模塊的一部分(它仍然是您可以運行的最高版本RHEL 5.x)。但它在5.14。 –

+1

「,它仍然是您可以在RHEL 5.x上運行的最高版本」。這是不正確的。的確,RHEL 5.x以Perl 5.8.8爲標準。但是沒有什麼能夠阻止你構建更新的版本。 –

+2

@DaveCross Chirs製作了一定的觀點。在RPM之外安裝Perl的更新版本並不總是可能的。 RHEL機器通常在企業生產環境中(否則,您將運行Fedora或Centos)。這些系統通常沒有完整的_developer工具集,例如安裝了C編譯器,您可能無法訪問它們以安裝工具,即使可以,運行生產環境的人也可能會看起來像在生產環境中安裝非官方版本的Perl的人。 –

4

如果您正在尋找共同的日期/時間格式,您可以用​​模塊

use DateTime::Format::CLDR; 
# 1. Basic example 
my $cldr = DateTime::Format::CLDR->new(
    pattern  => 'dd.MM.yyyy HH:mm:ss', 
    locale  => 'de_DE', 
    time_zone => 'Europe/Berlin', 
); 
my $dt = $cldr->parse_datetime('26.06.2013 11:05:28');