更新:この機能はTemplateToolkitプラグインに実装されているようです。残りの回答は参考のためにここに残しておきますが、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