如何用Perl解析相对日期?

时间:2008-11-17 20:13:05

标签: perl datetime parsing date

我很想知道是否有一个模块可以解析Perl中的“人格式化”日期。我的意思是“明天”,“星期二”,“下周”,“1小时前”。

我对CPAN的研究表明,没有这样的模块,那么你将如何创建一个模块呢? NLP是最重要的。

4 个答案:

答案 0 :(得分: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 :(得分: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:)

-Steve

答案 2 :(得分: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

答案 3 :(得分:-2)

我假设你有上下文。 NLP怎么能在这里帮忙? 作为一个狂野的猜测你可以找到最接近的日期,这是一个确切的日期(不是相对于今天),并使用今天/ tommorow /昨天与之相关。