我需要在以下范围内指定的所有月份进行循环(foreach):
01-2013至09-2015(月 - 月)格式。
棘手的部分是,在每个循环中我都需要月 - 年数据以及运行SQL查询,所以我不能使用简单的+1计数器。
我看起来像Date :: Calc和Date :: Simple但它没有给我一个解决方案 有没有人有我可以使用的代码片段或想出如何应对这一挑战的想法?
答案 0 :(得分:7)
DateTime模块有一个很好的函数add
,它允许你向对象添加你想要的任何时间:
use strict;
use warnings;
use DateTime;
use feature 'say';
my $start = DateTime->new(year => 2013, month => 1);
my $end = DateTime->new(year => 2015, month => 9);
while ($start <= $end) {
$start->add(months => 1);
say $start->strftime("%m-%Y");
}
答案 1 :(得分:1)
如果您只需要遍历日期,为什么不直接使用它:
for my $year (2013..2015) {
for my $month (1..12) {
my $date = sprintf "%02d-%d", $month, $year;
# do your $date processing here
...
last if ($date eq "09-2015");
}
}
答案 2 :(得分:0)
Date::Calc太棒了。再次检查
use Date::Calc();
my ($month, $year, $end_month, $end_year) = (1, 2013, 9, 2015);
while (($year < $end_year) || ($year == $end_year && $month <= $end_month)) {
print "year: $year, month: $month\n";
($year, $month) = Date::Calc::Add_Delta_YMD($year,$month,1,0,1,0);
}
答案 3 :(得分:0)
my $start_date = '01-2013';
my $end_date = '09-2015';
my ($sm, $sy) = split '-', $start_date;
my ($em, $ey) = split '-', $end_date;
for my $y ($sy..$ey) {
for my $m (1..12) {
next if ($y==$sy && $m<$sm);
last if ($y==$ey && $m>$em);
# use $m and $y for further processing sql query
# print "Month: $m\t Year: $y\n";
# ...
}
}