2010-10-25 68 views
3

我有一個看起來像25-OCT-10 04.11.00.000000 AM的時間戳。我試圖將其轉換爲時間格式與如何用Time :: Piece strptime解析微秒?

Time::Piece->strptime("25-OCT-10 04.11.00.000000 AM","%d-%b-%y %I.%M.%S.%6N %p") 

但它一直拋出錯誤。我試過%OS,%SZ。他們似乎沒有工作。有人能告訴我我做錯了什麼嗎?

回答

10

Time::Piece不支持亞秒級時間。嘗試DateTime代替,例如,DateTime::Format::Strptime

use DateTime::Format::Strptime; 

my $parser = DateTime::Format::Strptime->new(
    pattern => '%d-%b-%y %I.%M.%S.%6N %p', 
); 

my $dt = $parser->parse_datetime("25-OCT-10 04.11.00.000000 AM"); 
5

strptime將無法​​讀取。 strptime的結構只能用於整數秒,並且它沒有用於識別非整數數字的任何格式 - 並且在Time::Piecestrptime中沒有N這樣的格式。如果你知道你總是期待.000000達幾微秒,那麼你可以嘗試使用..."%I.%M.%S.000000 %p",否則strptime只是不適合你。

DateTime::Format::CLDR怎麼樣?格式爲"dd-MMM-yy hh.mm.ss.SSSSSS a"似乎與該格式非常吻合。

use DateTime::Format::CLDR; 
my $parser = DateTime::Format::CLDR->new(
    pattern => "dd-MMM-yy hh.mm.ss.SSSSSS a", 
    locale => "en_US", 
); 
my $dt = $parser->parse_datetime("25-OCT-10 04.11.00.000100 AM"); 

say $dt->iso8601; # 2010-01-25T04:11:00 

編輯:只注意到這個不承認幾個月正確,如果他們都是大寫的 - 它承認「十月」,而不是「華僑城」。固定版本可用here並已發送上游合併:)

更新: DateTime :: Format :: CLDR 1.11是正確的大小寫不敏感。

+0

DateTime的strptime(在DateTime :: Format :: Strptime中)理解'%6N'意思是毫秒。但是CLDR也起作用。 – cjm 2010-10-25 06:30:24

+0

@cjm DateTime :: Format :: Strptime聽起來像是一個很好的臨時修復,然後,謝謝:) – hobbs 2010-10-25 06:44:21

+0

它也接受OCT和10月與'%b'。 :-) – cjm 2010-10-25 06:45:31