【发布时间】:2010-09-22 17:49:32
【问题描述】:
我很想知道在 Perl 中是否有解析“人工格式化”日期的模块。我的意思是“明天”、“星期二”、“下周”、“1 小时前”。
我对 CPAN 的研究表明没有这样的模块,那么您将如何创建一个呢? NLP 在这方面做得非常好。
【问题讨论】:
标签: perl datetime parsing date
我很想知道在 Perl 中是否有解析“人工格式化”日期的模块。我的意思是“明天”、“星期二”、“下周”、“1 小时前”。
我对 CPAN 的研究表明没有这样的模块,那么您将如何创建一个呢? NLP 在这方面做得非常好。
【问题讨论】:
标签: perl datetime parsing date
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 提供的函数之一,第一个参数是模块支持的任何格式的日期/时间,第二个参数描述如何格式化日期/时间。还有其他函数只解析这些“人类”日期,而不对其进行格式化,用于增量计算等。
【讨论】:
您可能还会发现查看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
【讨论】:
我假设你有上下文。 NLP 在这里如何提供帮助? 作为一个疯狂的猜测,您可以找到最接近的日期,即确切日期(与今天无关)并使用今天/明天/昨天来与之相关。
【讨论】: