我很想知道是否有一個模塊在Perl中解析「人類格式化」日期。我的意思是「明天」,「星期二」,「下週」,「1小時前」等。我該如何解析Perl的相對日期?
我對CPAN的研究表明,沒有這樣的模塊,那麼您將如何創建一個? NLP在這方面遠遠超過了頂峯。
我很想知道是否有一個模塊在Perl中解析「人類格式化」日期。我的意思是「明天」,「星期二」,「下週」,「1小時前」等。我該如何解析Perl的相對日期?
我對CPAN的研究表明,沒有這樣的模塊,那麼您將如何創建一個? NLP在這方面遠遠超過了頂峯。
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
提供的功能中的一個,第一個參數是在日期/時間該模塊支持的任何格式,第二個參數描述如何格式化日期/時間。還有其他的功能,只是解析這些「人類」的日期,沒有格式化它們,用於三角洲計算等。
我假設你有上下文。 NLP如何幫助這裏? 作爲一個瘋狂的猜測,你可以找到最近的日期是一個確切的日期(不是相對於今天),並使用今天/ tommorow /昨天與此有關。
你也許會發現看看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 :)
史蒂夫
就個人而言,我一直使用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
啊,美好的舊日期:: MANIP ...你怎麼能不愛試圖好難講出你使用的模塊它? – 2008-11-18 01:53:09
準確地說,我在找什麼,但(像往常一樣)我不知道如何解釋這個問題。謝謝。 – andymurd 2008-11-18 10:07:09