如何用Perl解析相对日期?

and*_*urd 10 perl datetime parsing date

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

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

Rob*_*ble 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
Run Code Online (Sandbox Code Playgroud)

这导致以下输出:

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)
Run Code Online (Sandbox Code Playgroud)

UnixDate是由其提供的函数之一Date::Manip,第一个参数是模块支持的任何格式的日期/时间,第二个参数描述如何格式化日期/时间.还有其他函数可以解析这些"人类"日期,而不对其进行格式化,以用于增量计算等.


hak*_*are 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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  
Run Code Online (Sandbox Code Playgroud)

TMTOWTDI :)

史蒂夫