В моем сценарии мне нужно выполнить итерацию по датам с датой начала и датой окончания. Как я могу это сделать в Perl?Как перебирать диапазон дат?
ответ
Использование DateTime
модуль. Вот простой пример, который перечисляет десять предыдущих дней:
use 5.012;
use warnings;
use DateTime;
my $end = DateTime->now;
my $day = $end->clone->subtract(days => 10); # ten days ago
while ($day < $end) {
say $day;
$day->add(days => 1); # move along to next day
}
Update (после просмотра вашего комментария/обновления):
Для разбора в строках даты, то смотрите на DateTime::Format
на модулях CPAN.
Вот пример использования DateTime::Format::DateParse
, который делает синтаксический YYYY/MM/DD:
use DateTime::Format::DateParse;
my $d = DateTime::Format::DateParse->parse_datetime('2010/06/23');
Perl имеет богатый набор временных и манипуляционную дату модулей, как показано здесь:
http://datetime.perl.org/?Modules
И есть некоторые примеры дата и время проблем там.
С Perl всегда есть много способов сделать это.
Вы можете попробовать Date::Calc::Iterator
# This puts all the dates from Dec 1, 2003 to Dec 10, 2003 in @dates1
# @dates1 will contain ([2003,12,1],[2003,12,2] ... [2003,12,10]) ;
my $i1 = Date::Calc::Iterator->new(from => [2003,12,1], to => [2003,12,10]) ;
my @dates1 ;
push @dates1,$_ while $_ = $i1->next ;
Конечно, в чем смысл использования итератора, если вы просто собираетесь вывести значения в массив? –
Один простой подход заключается в использовании Date::Simple
модуль, который использует от оператора-перегрузки:
use strict;
use warnings;
use Date::Simple;
my $date = Date::Simple->new ('2010-01-01'); # Stores Date::Simple object
my $endDate = Date::Simple->today; # Today's date
while (++$date < $endDate) {
print ($date - $endDate) , "day",
(($date-$endDate) == 1 ? '' : 's'), " ago\n";
}
use DateTime::Format::Strptime qw();
my $start = DateTime::Format::Strptime->new(pattern => '%Y/%m/%d')->parse_datetime('2010/08/16');
my $end = DateTime::Format::Strptime->new(pattern => '%Y/%m/%d')->parse_datetime('2010/11/24');
while ($start < $end) {
$start->add(days => 1);
say $start->ymd('/');
}
Я хотел бы использовать тот факт, что strftime
нормализуется дату для меня:
#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw/strftime/;
my $start = "2010/08/16";
my $end = "2010/09/16";
my @time = (0, 0, 0);
my ($y, $m, $d) = split "/", $start;
$y -= 1900;
$m--;
my $offset = 0;
while ((my $date = strftime "%Y/%m/%d", @time, $d + $offset, $m, $y) le $end) {
print "$date\n";
} continue {
$offset++;
}
При установке дополнительных модулей перл не является предпочтительным, можно использовать этот подход, основанный на основном библиотека Perl POSIX:
#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw(strftime);
# CREATE CALENDAR
my @Calendar =();
my $years = 3;
my @Now = localtime(); # An array of 9 date-time parameters.
for my $count (0 .. (365 * $years)) {
# If date is January 1st, manual shift to December 31st is needed,
# because days ([yday][2]) are counted from January 31st and never shift back one year.
if($Now[4] == 0 && $Now[3] == 1) {
unshift @Calendar, strftime("%Y-%m-%d", @Now);
$Now[5] --; # Reduce by one the sixth array element #5 - year.
$Now[4] = 11; # Set fifth array element № 4 - to December.
$Now[3] = 31; # Set fourth array element № 3 - to 31st.
} else {
unshift @Calendar, strftime("%Y-%m-%d", @Now);
$Now[3] --;
}
}
# Print out.
my $size = @Calendar;
for (my $i = 0; $i < $size; $i++) {
print $Calendar[$i]."\n";
}
- 1. Lua перебирать диапазон дат
- 2. Как перебирать диапазон дат в PL/SQL
- 3. Как перебирать диапазон дат в java
- 4. Как перебирать диапазон дат в C++
- 5. Как перебирать диапазон перестановок?
- 6. Как применять диапазон дат?
- 7. Как перебирать заданный диапазон чисел?
- 8. Как перебирать диапазон в ERB?
- 9. Панды диапазон дат отдельных дат
- 10. Диапазон дат в диапазоне дат
- 11. MySQL выбрать диапазон дат диапазон
- 12. Как создать диапазон дат из списка дат
- 13. Диапазон дат в диапазоне дат
- 14. ВПР: искомое_значение, как диапазон дат
- 15. Как выбрать определенный диапазон дат?
- 16. Как ограничить диапазон дат jqueryui?
- 17. Как отправить диапазон дат месяца
- 18. SQL для поиска диапазон дат, используя диапазон дат
- 19. SSRS Диапазон дат Фильтр
- 20. MongoDB вопрос диапазон дат
- 21. jQuery Validate (Диапазон дат)
- 22. Excel Диапазон дат
- 23. фильтр диапазон дат elasticsearch
- 24. Диапазон дат в RazorSQL
- 25. DataTables Диапазон дат фильтра
- 26. Диапазон дат SQL Query
- 27. Validaing Диапазон дат
- 28. Сложение диапазон дат
- 29. Диапазон дат в Java
- 30. Excel - выделить диапазон дат в другой диапазон дат
В каком формате указаны даты? гггг-мм-дд? – Zaid
Формат должен быть YYYY/MM/DD – nimo