7

通常の日時を取り、適切な相対的な人間が読める日付を作成できるライブラリ(できればDateTime -esque)があるかどうかを知りたいです。基本的に、より一般的な質問の正反対です: Perl で相対日付を解析するにはどうすればよいですか? .

明らかに、正確な文言/解釈は実際の実装次第ですが、将来的に日付を指定する一貫した方法を提供したいと考えています。「 」のような概算を知ること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"
4

3 に答える 3

8

更新:この機能は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
于 2009-07-09T15:07:03.450 に答える
4

Twitter Fan WikiのRelative Time Scriptsを参照してください。

于 2009-07-09T15:19:50.600 に答える
3

Date::Manipは、このようなものに対して非常に強力ですが、 Date::Calcよりも遅くなります。

于 2009-07-09T15:44:22.983 に答える