2009-07-09 17 views
7

Mi piacerebbe sapere se sono presenti librerie (preferibilmente DateTime-esque) che possono richiedere un normale orario e creare una data relativa leggibile dall'uomo. Sostanzialmente l'esatto opposto della domanda più comune: How can I parse relative dates with Perl?.Come posso creare date relative/approssimative in Perl?

Ovviamente, l'esatta espressione/interpretazione dipende dall'attuale implementazione, ma sto cercando di fornire un modo coerente per specificare date in futuro. Conoscere una approssimazione del tipo "due in 2 weeks" è (per me) più utile per capire quanto tempo mi rimane di qualcosa "due on 2009-07-30".

Esempi:

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" 

risposta

7

Aggiornamento: Sembra che questa funzionalità è implementata in un Template Toolkit Plugin. Sto lasciando il resto della mia risposta qui per riferimento, ma Template::Plugin::DtFormatter potrebbe essere il posto migliore per guardare.

Guardando il codice sorgente di quel modulo, sono stato portato a DateTime::Format::Natural che sembra correlato a ciò che si desidera.

risposta precedente:

Guardate in Date::Calc per darvi delta utilizzando Delta_DHMS. Dovresti essere in grado di usare quei delta per scegliere come pronunciare la data.

Ecco un punto di partenza molto rudimentale. È buggy ma illustra l'idea di base. Aggiungi logica al gusto.

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

uscita:

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

Eh? Perché il downvote? –

+0

Lo so, giusto? Le persone non voteranno nulla su questo sito. Non c'è bisogno di essere cattivo! – mcandre

Problemi correlati