¿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"
Date :: Manip es muy poderoso para cosas como esta, pero más lento que Date :: Calc .
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