什么是好的Perl模块(或好的方法),它返回开始日期和结束日期之间的所有有效日历日期?
例如,如果我将1/29/2009作为开始日期而2/3/2009作为结束日期,那么我希望它返回2009年1月30日,2009年1月31日的数组, 2009年2月1日和2009年2月2日。必须有一个好的Perl模块已经完成了这个并且占了闰年,几个月,但我找不到它。
感谢您的建议!
答案 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::Simple
和Date::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 )
也是如此。