Perl:在指定范围内循环几个月

时间:2013-11-01 10:13:00

标签: perl date datetime

我需要在以下范围内指定的所有月份进行循环(foreach):
  01-2013至09-2015(月 - 月)格式。
棘手的部分是,在每个循环中我都需要月 - 年数据以及运行SQL查询,所以我不能使用简单的+1计数器。

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

4 个答案:

答案 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";
    # ...

  }
}