Хорошее начало - читать Множество дат Perl и сайт DateTime .
Формат YYYY-MM-DD является формой ISO 8601 представление даты.Существуют варианты, которые считаются приемлемыми, такие как YYYY-MM-DD
и YYYYMMDD
и даже YYMM
в более старых данных.Вы должны посмотреть на окончательный список , прежде чем выбрать метод для сравнения этих дат.
Если строки дат ISO 8601: 1) допустимые даты;2) в том же формате с разделителем -
или без него;3) отсутствие пробелов в начале и в конце, привлекательным свойством является то, что вы можете сортировать или сравнивать строки с помощью простых лексикографических сравнений строк.
В общем, тогда:
- IFF вы не собираетесь проверять, действительны ли даты, и IFF они совпадаютформат и IFF нет пробелов в начале или в конце, вы можете сравнить с другой строкой, представляющей целевую дату в том же формате.
--- В противном случае ---
Выберите модуль CPAN для анализа вашей строки даты (или сопоставьте ее самостоятельно),
Конвертировать в время эпохи, если ваши даты находятся в этом диапазоне (или использовать модуль CPAN, который выполняет более масштабные манипуляции с датой / временем, такие как Date :: Manip или Date :: Calc)
Выполните арифметику по типу времени (время эпохи, абсолютные дни и т. Д.)
Преобразуйте время обратно в нужный вам формат ...
Вот код, который делает это:
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";
}