Un buen comienzo es leer The Many Dates of Perl y el sitio DateTime.
El formato YYYY-MM-DD es una forma de representación de fecha de ISO 8601. Hay variantes de él que se consideran aceptables, como YYYY-MM-DD
y YYYYMMDD
e incluso YYMM
en datos anteriores. Debería ver un definitive list antes de elegir un método para comparar estas fechas.
Si las cadenas de fechas de ISO 8601 son: 1) fechas válidas; 2) en el mismo formato con o sin el delimitador -
; 3) carente de espacio en blanco inicial y final, una propiedad atractiva es que puede ordenar o comparar las cadenas con simples comparaciones de cadenas lexicográficas.
En general, entonces:
- IFF no se va a comprobar si las fechas son válidas y IFF que son el mismo formato, y IFF no hay espacios en blanco iniciales o finales , puede comparar con otra cadena que representa la fecha objetivo en ese mismo formato.
--- --- De lo contrario
Decidir sobre un módulo CPAN para analizar su cadena de fecha (o coincidir con usted mismo),
Convertir a efeméride del instante si si las fechas están en ese rango, (o usan un módulo CPAN que hace una manipulación de fecha/hora a mayor escala como Date :: Manip o Date :: Calc)
Realice la aritmética en el tipo de tiempo (época, días absolutos, whateve r)
convertir el tiempo de nuevo en el formato que desea ...
Aquí está el código que hace que:
use warnings; use strict;
use Date::Calc qw/:all/;
my (@date_strings, @abs_days);
my $target=Date_to_Days(2010, 1, 15);
# set @date_string to "YYYY-MM-DAY" between some dates
for my $AbsDay(Date_to_Days(2009,1,1)..Date_to_Days(2011,12,31)) {
my ($year, $mon, $day)=Add_Delta_Days(1,1,1,$AbsDay-1);
my $s="$year-$mon-$day";
push @date_strings, $s;
}
foreach my $s (@date_strings) {
my ($year, $mon, $day);
if(($year, $mon, $day)=$s=~/^(\d+)-(\d+)-(\d+)/) {
my $days=Date_to_Days($year, $mon, $day);
push @abs_days, $days
if ($target-$days <= 30 && $target-$days >= -30);
}
}
print "absolute day way:\n";
foreach my $days (@abs_days) {
my ($year, $mon, $day)=Add_Delta_Days(1,1,1,$days-1);
print "$year-$mon-$day\n";
}
Por qué votaron abajo? Bastante buena pregunta, ¿sí? – Xailor
Me encanta cómo esta pregunta provocó una discusión entre los puristas y los pragmáticos. – paddy