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

前端之家收集整理的这篇文章主要介绍了如何在Perl中创建相对/近似日期?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道是否有任何库(最好是 DateTime-esque)可以采用正常的日期时间并创建一个适当的相对人类可读日期.
基本上与更常见的问题完全相反: How can I parse relative dates with Perl?.

显然,确切的措辞/解释取决于实际的实施,但我希望提供一种一致的方式来指定未来的日期.知道像“在两周内到期”这样的约会(对我而言)更有助于掌握我剩余的时间,而不是“应付于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"

解决方法

更新:看起来这个功能是在 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,30 ],9 ],9,12,32 ],5,43 ],3,14 ],[ 2010,8,[ 2012,[ 2013,);

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,$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

猜你在找的Perl相关文章