perl datetime nlp relative-date

¿Cómo puedo crear fechas relativas/aproximadas en Perl?



datetime nlp (3)

Mira las secuencias de tiempo relativo en Twitter Fan Wiki.

Me gustaría saber si hay bibliotecas (preferiblemente DateTime -esque) que pueden tomar una fecha normal y crear una fecha de lectura humana relativa adecuada. Esencialmente el opuesto exacto de la pregunta más común: ¿cómo puedo analizar las fechas relativas con Perl? .

Obviamente, la redacción / interpretación exacta depende de la implementación real, pero estoy buscando proporcionar una manera consistente de especificar las fechas en el futuro. Saber una aproximación como " due in 2 weeks " es (para mí) más útil para comprender cuánto tiempo me queda que algo "con due on 2009-07-30 ".

Ejemplos:

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"



Actualización: parece que esta funcionalidad se implementa en un complemento de Toolkit de plantillas . Dejo el resto de mi respuesta aquí para referencia, pero Template :: Plugin :: DtFormatter podría ser el mejor lugar para buscar.

Al mirar el código fuente de ese módulo, me llevaron a DateTime :: Format :: Natural, que parece estar relacionado con lo que quiere.

Respuesta anterior:

Mire en Date :: Calc para darle deltas usando Delta_DHMS . Debería poder utilizar esos deltas para elegir cómo se va a expresar la fecha.

Aquí hay un punto de partida muy rudimentario. Tiene errores, pero ilustra la idea básica. Agregue lógica 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__

Salida:

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