如何在Perl中创建相对/近似日期?

时间:2009-07-09 14:58:44

标签: perl datetime nlp relative-date

我想知道是否有任何库(最好是DateTime - esque)可以采用正常的日期时间并创建一个适当的相对人类可读日期。 基本上与更常见的问题完全相反:How can I parse relative dates with Perl?

显然,确切的措辞/解释取决于实际的实施,但我希望提供一种一致的方式来指定未来的日期。知道像“due in 2 weeks”这样的apporximation(对我来说)更有助于掌握我剩余的时间而不是“due on 2009-07-30”。

示例:

2009-07-06        => "in 1 year"
2009-07-30        => "in 2 weeks"
2009-07-09        => "tomorrow"
2009-07-09 12:32  => "tomorrow at 12:32"
2009-07-12 05:43  => "monday morning"
2009-07-03 05:74  => "6 days ago"

3 个答案:

答案 0 :(得分:8)

更新:此功能似乎在Template Toolkit Plugin中实施。我将其余部分留在此处作为参考,但Template::Plugin::DtFormatter可能是最适合观看的地方。

查看该模块的源代码,我领先于DateTime::Format::Natural,这似乎与您想要的内容相关。

上一个答案:

查看Date::Calc,使用Delta_DHMS为您提供增量。您应该能够使用这些增量来选择如何标记日期。

这是一个非常基本的起点。这是错误的,但说明了基本的想法。添加逻辑来品味。

#!/usr/bin/perl

use strict;
use warnings;

use Date::Calc qw(:all);
use Lingua::EN::Inflect qw( NO );

my @dates = (
    [ 2009, 7,  6 ],
    [ 2009, 7, 30 ],
    [ 2009, 7,  9 ],
    [ 2009, 7,  9, 12, 32 ],
    [ 2009, 7, 12,  5, 43 ],
    [ 2009, 7,  3,  5, 14 ],
    [ 2010, 8, 9 ],
    [ 2012, 8, 9 ],
    [ 2013, 8, 9 ],
);

for my $date ( @dates ) {
    print "@$date: ", relative_when( $date ), "\n";
}

sub relative_when {
    my ($year, $month, $day, $hour, $min, $sec) = @{ $_[0] };
    my ($Dyear, $Dmon, $Dday, $Dhr, $Dmin, $Dsec) = Delta_YMDHMS(
        Today_and_Now(),
        $year, $month, $day, $hour || 0, $min || 0, $sec || 0
    );
    return NO('year',  $Dyear )     if $Dyear > 0;
    return NO('month', $Dmon )      if $Dmon  > 0;
    return NO('week',  int($Dday/7) if $Dday  > 6;
    return NO('day',   $Dday)       if $Dday  > 1;
    return 'tomorrow' if $Dday == 1;
    return 'today'    if $Dday == 0;
    return "";
}

__END__

输出:

C:\Temp> dfg
2009 7 6:
2009 7 30: 2 weeks
2009 7 9: today
2009 7 9 12 32: today
2009 7 12 5 43: 2 days
2009 7 3 5 14:
2010 8 9: 1 year
2012 8 9: 3 years
2013 8 9: 4 years

答案 1 :(得分:4)

查看Twitter粉丝维基上的Relative Time Scripts

答案 2 :(得分:3)

Date::Manip对于像这样的东西非常强大,但比Date::Calc慢。