确定日期范围内日期的好方法是什么?

时间:2009-03-11 19:28:22

标签: perl data-structures datetime

什么是好的Perl模块(或好的方法),它返回开始日期和结束日期之间的所有有效日历日期?

例如,如果我将1/29/2009作为开始日期而2/3/2009作为结束日期,那么我希望它返回2009年1月30日,2009年1月31日的数组, 2009年2月1日和2009年2月2日。必须有一个好的Perl模块已经完成了这个并且占了闰年,几个月,但我找不到它。

感谢您的建议!

6 个答案:

答案 0 :(得分:9)

DateTime,我已多次使用它,它可以做任何你能想到的日期。它处理闰年,闰秒,无效日期/时间,它可以输出任何格式的日期,它可以比较,添加,减去等...

唯一的问题是它可能有点矫枉过正。

答案 1 :(得分:6)

以下是使用DateTime的示例:

use strict;
use warnings;

use DateTime;

my $d1 = DateTime->new( month => 1, day => 29, year => 2009);
my $d2 = DateTime->new( month => 2, day => 3,  year => 2009);

while ($d1 <= $d2) {
  print $d1->strftime("%m/%d/%Y"),"\n";
  $d1->add(days => 1);
}

答案 2 :(得分:4)

这是一个刺。它需要Date::SimpleDate::Range

#!/usr/bin/env perl
use strict;
use warnings;
use Date::Simple;
use Date::Range;

my $d1 = Date::Simple->new('2009-03-02');
my $d2 = Date::Simple->new('2009-03-07');

my $range = Date::Range->new( $d1, $d2 );

for my $date ($range->dates) {
  print $date->format("%m/%d/%Y"), "\n" # Fixed format
}

答案 3 :(得分:3)

答案 4 :(得分:2)

Date::Manip似乎是Perl中的规范日期模块。它有一个奇怪的API,但它的工作原理。以下是使用ParseRecur函数执行所需操作的示例:

#!/usr/bin/perl
use warnings;
use strict;

use Date::Manip;
use Data::Dumper;

my ($start, $end) = qw(2009-01-29 2009-02-03);

# Exclude start date
$start = DateCalc($start, "+1 day");

# y:m:w:d:h:m:s
my @dates = ParseRecur('0:0:0:1:0:0:0', $start, $start, $end);

for my $date (@dates) {
    print UnixDate($date, "%Y-%m-%d\n");
}

答案 5 :(得分:0)

由于POSIX::mktime的强大功能,您可以执行以下操作:

use POSIX qw<mktime strftime>;

my ( $month, $day, $year )  = ( 8, 16, 2008 );
my $end_date   = mktime( 0, 0, 0, 1, 2 - 1, 2009 - 1900 );
while ( 1 ) { 
    my $date = mktime( 0, 0, 0, $day++, $month - 1, $year - 1900 );
    push @date_range, strftime( '%x', localtime $date );
    last if $date >= $end_date;
}

mktime( 0, 0, 0, 500, 0, 108 )有意义。但是,对于任何一年的2月份的最后一天,mktime( 0, 0, 0, 0, 2, x )也是如此。