2008-11-17 29 views
10

我很想知道是否有一個模塊在Perl中解析「人類格式化」日期。我的意思是「明天」,「星期二」,「下週」,「1小時前」等。我該如何解析Perl的相對日期?

我對CPAN的研究表明,沒有這樣的模塊,那麼您將如何創建一個? NLP在這方面遠遠超過了頂峯。

回答

23

Date::Manip正是這樣。

下面是一個例子的程序:

#!/usr/bin/perl 

use strict; 
use Date::Manip; 

while (<DATA>) 
{ 
    chomp; 
    print UnixDate($_, "%Y-%m-%d %H:%M:%S"), " ($_)\n"; 
} 

__DATA__ 
today 
yesterday 
tomorrow 
last Tuesday 
next Tuesday 
1 hour ago 
next week 

這導致下面的輸出:

2008-11-17 15:21:04 (today) 
2008-11-16 15:21:04 (yesterday) 
2008-11-18 15:21:04 (tomorrow) 
2008-11-11 00:00:00 (last Tuesday) 
2008-11-18 00:00:00 (next Tuesday) 
2008-11-17 14:21:04 (1 hour ago) 
2008-11-24 00:00:00 (next week) 

UnixDate是由Date::Manip提供的功能中的一個,第一個參數是在日期/時間該模塊支持的任何格式,第二個參數描述如何格式化日期/時間。還有其他的功能,只是解析這些「人類」的日期,沒有格式化它們,用於三角洲計算等。

+1

啊,美好的舊日期:: MANIP ...你怎麼能不愛試圖好難講出你使用的模塊它? – 2008-11-18 01:53:09

+0

準確地說,我在找什麼,但(像往常一樣)我不知道如何解釋這個問題。謝謝。 – andymurd 2008-11-18 10:07:09

-2

我假設你有上下文。 NLP如何幫助這裏? 作爲一個瘋狂的猜測,你可以找到最近的日期是一個確切的日期(不是相對於今天),並使用今天/ tommorow /昨天與此有關。

9

你也許會發現看看DateTime::Format系列,特別是DateTime::Format::Natural有趣。一旦你將日期/時間解析成DateTime對象,你就可以用很多不同的方式來操作和評估它。

這裏有一個示例程序:

use strict; 
use warnings; 

use DateTime::Format::Natural; 

my($parser) = DateTime::Format::Natural->new; 

while (<>) { 

    chomp; 
    my($dt) = $parser->parse_datetime($_); 

    if ($parser->success) { 

     print join(' ', $dt->ymd, $dt->hms) . "\n"; 
    } 
    else { 

     print $parser->error . "\n"; 
    } 
} 

輸出:此

tomorrow 
2008-11-18 21:48:49 
next Tuesday 
2008-11-25 21:48:53 
1 week from now 
2008-11-24 21:48:57 
1 hour ago 
2008-11-17 20:48:59 

TMTOWTDI :)

史蒂夫

2

就個人而言,我一直使用Time::ParseDate。它非常瞭解我嘗試過的每種格式。

絕對日期格式

Dow, dd Mon yy 
    Dow, dd Mon yyyy 
    Dow, dd Mon 
    dd Mon yy 
    dd Mon yyyy 
    Month day{st,nd,rd,th}, year 
    Month day{st,nd,rd,th} 
    Mon dd yyyy 
    yyyy/mm/dd 
    yyyy-mm-dd  (usually the best date specification syntax) 
    yyyy/mm 
    mm/dd/yy 
    mm/dd/yyyy 
    mm/yy 
    yy/mm  (only if year > 12, or > 31 if UK) 
    yy/mm/dd (only if year > 12 and day < 32, or year > 31 if UK) 
    dd/mm/yy (only if UK, or an invalid mm/dd/yy or yy/mm/dd) 
    dd/mm/yyyy (only if UK, or an invalid mm/dd/yyyy) 
    dd/mm  (only if UK, or an invalid mm/dd) 

相對日期格式:

count "days" 
    count "weeks" 
    count "months" 
    count "years" 
    Dow "after next" 
    Dow "before last" 
    Dow      (requires PREFER_PAST or PREFER_FUTURE) 
    "next" Dow 
    "tomorrow" 
    "today" 
    "yesterday" 
    "last" dow 
    "last week" 
    "now" 
    "now" "+" count units 
    "now" "-" count units 
    "+" count units   
    "-" count units 
    count units "ago" 

絕對時間格式:

hh:mm:ss[.ddd] 
    hh:mm 
    hh:mm[AP]M 
    hh[AP]M 
    hhmmss[[AP]M] 
    "noon" 
    "midnight" 

相對時間格式:

count "minutes"   (count can be franctional "1.5" or "1 1/2") 
    count "seconds" 
    count "hours" 
    "+" count units 
    "+" count 
    "-" count units 
    "-" count 
    count units "ago" 

時區格式:

[+-]dddd 
    GMT[+-]d+ 
    [+-]dddd (TZN) 
    TZN 

特殊格式:

[ d]d/Mon/yyyy:hh:mm:ss [[+-]dddd] 
    yy/mm/dd.hh:mm