我需要为范围内指定的所有月份创建一个循环(foreach),例如:
01-2013 到 09-2015(月-年)格式。
棘手的部分是,在每个循环中,我还需要月 - 年数据来运行 sql 查询,所以我不能使用简单的 +1 计数器。
我看起来像 Date::Calc 和 Date::Simple 但它没有为我提供解决方案。
有没有人有我可以使用的代码片段或想出如何应对这一挑战的想法?
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");
}
如果您只需要遍历日期,为什么不直接使用:
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");
}
}
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);
}
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";
# ...
}
}