gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:13:20 27 4
gpt4 key购买 nike

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

显然,确切的措辞/解释取决于实际的实现,但我希望提供一种一致的方式来指定 future 的日期。知道像“due in 2 weeks”这样的近似值(对我来说)比“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"

最佳答案

更新:看起来这个功能是在 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

关于perl - 如何在 Perl 中创建相对/近似日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1104429/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com