【问题标题】:How can I parse relative dates with Perl?如何用 Perl 解析相对日期?
【发布时间】:2010-09-22 17:49:32
【问题描述】:

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

我对 CPAN 的研究表明没有这样的模块,那么您将如何创建一个呢? NLP 在这方面做得非常好。

【问题讨论】:

    标签: perl datetime parsing date


    【解决方案1】:

    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 提供的函数之一,第一个参数是模块支持的任何格式的日期/时间,第二个参数描述如何格式化日期/时间。还有其他函数只解析这些“人类”日期,而不对其进行格式化,用于增量计算等。

    【讨论】:

    • 啊,好老的 Date::Manip... 你怎么能不喜欢一个如此努力说服你放弃使用它的模块?
    • 正是我想要的,但是(像往常一样)我不知道如何表达这个问题。谢谢。
    • 我认为 DateTime 是社区现在最推崇的综合日期和时间解决方案。查看 datetime.perl.org 和这篇文章 perl.com/pub/a/2003/03/13/datetime.html
    【解决方案2】:

    您可能还会发现查看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 :)

    -史蒂夫

    【讨论】:

    • 感谢您推荐日期时间。是的,一个真正的系统!
    【解决方案3】:

    就我个人而言,我一直为此使用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
    

    【讨论】:

    • 很遗憾,它不理解大多数标准格式,例如 ISO 8601:/
    【解决方案4】:

    我假设你有上下文。 NLP 在这里如何提供帮助? 作为一个疯狂的猜测,您可以找到最接近的日期,即确切日期(与今天无关)并使用今天/明天/昨天来与之相关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2010-11-09
      • 2016-02-15
      • 2012-01-09
      • 1970-01-01
      相关资源
      最近更新 更多