2

我需要为范围内指定的所有月份创建一个循环(foreach),例如:
01-2013 到 09-2015(月-年)格式。
棘手的部分是,在每个循环中,我还需要月 - 年数据来运行 sql 查询,所以我不能使用简单的 +1 计数器。

我看起来像 Date::Calc 和 Date::Simple 但它没有为我提供解决方案。
有没有人有我可以使用的代码片段或想出如何应对这一挑战的想法?

4

4 回答 4

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"); 
}
于 2013-11-01T10:36:34.953 回答
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");
    }
}
于 2013-11-01T10:22:29.323 回答
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);
}
于 2013-11-01T10:24:03.977 回答
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";
    # ...

  }
}
于 2013-11-01T10:30:25.933 回答