2009-07-09 12 views
7

Normal bir tarih alabilen ve uygun bir akraba insan okunabilir tarihi oluşturabilen herhangi bir kütüphanenin (tercihen DateTime -esque) olup olmadığını bilmek istiyorum. Esas olarak, daha sık sorulan sorunun tam tersi: How can I parse relative dates with Perl?.Perl'de nispi/yaklaşık tarihleri ​​nasıl oluşturabilirim?

Açıkçası, tam anlatım/yorumlama fiili uygulamaya kalmış, ama gelecekte tarih belirlemek için tutarlı bir yol sağlamak için arıyorum. "due in 2 weeks" gibi bir görüntünün bilinmesi, bana "due on 2009-07-30" gibi bir şeyden daha ne kadar zaman geçirdiğimi anlamada yardımcı olur.

Örnekler:

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" 

cevap

7

Güncelleme: bu işlevsellik bir Template Toolkit Plugin uygulanan gibi görünüyor. Cevabımın geri kalanını referans için burada bırakıyorum, ancak Template::Plugin::DtFormatter bakmak için en iyi yer olabilir.

o modülün kaynak koduna baktığımızda, sana istedikleri ile alakalı görünmektedir DateTime::Format::Natural skoru oldu.

Önceki Cevap: Date::Calc içine

Bak Delta_DHMS kullanarak size deltalar vermek. Tarihini nasıl ifade edeceğinizi seçmek için bu deltaları kullanabilmeniz gerekir.

İşte çok ilkel bir başlangıç ​​noktası. Bu arabadır ama temel fikri gösterir. Tadına mantık ekle.

#!/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__ 

Çıktı: Heyecan Fan Wikisi'ndeki Relative Time Scripts de

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 
+0

Huh? Neden düşüş var? –

+0

Biliyorum, değil mi? İnsanlar bu sitede herhangi bir şeyi reddedecek. Ortaya gerek yok! – mcandre

İlgili konular