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

Perl 确定日期范围内的日期的好方法是什么?,perl,data-structures,datetime,Perl,Data Structures,Datetime,返回开始日期和结束日期之间所有有效日历日期的好Perl模块(或好方法)是什么 例如,如果我将2009年1月29日作为开始日期,将2009年2月3日作为结束日期,那么我希望它返回一个包含2009年1月30日、2009年1月31日、2009年2月1日和2009年2月2日的数组。一定有一个很好的Perl模块已经做到了这一点,并且考虑了闰年、闰月,但我找不到它 谢谢你的建议 软件包,我已经用过很多次了,它几乎可以做任何你能想到的关于日期的事情。它可以处理闰年、闰秒、无效日期/时间,它可以以任何格式输出日

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

例如,如果我将2009年1月29日作为开始日期,将2009年2月3日作为结束日期,那么我希望它返回一个包含2009年1月30日、2009年1月31日、2009年2月1日和2009年2月2日的数组。一定有一个很好的Perl模块已经做到了这一点,并且考虑了闰年、闰月,但我找不到它

谢谢你的建议

软件包

,我已经用过很多次了,它几乎可以做任何你能想到的关于日期的事情。它可以处理闰年、闰秒、无效日期/时间,它可以以任何格式输出日期,它可以比较、加、减等

唯一的问题是它可能有点过分。

似乎是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");
}

这里有一个刺。它要求并:


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

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;
}
使用POSIXQW;
我的($month,$day,$year)=(8,162008);
我的$end_date=mktime(0,0,0,1,2-12009-1900);
而第(1)款{
my$date=mktime(0,0,0,$day++,$month-1,$year-1900);
推送@date\u范围,strftime(“%x”,localtime$date);
如果$date>=$end\u date,则为最后一次;
}
使用
mktime(0,0,0,500,0,108)
有意义。但是,对于任何一年的最后一个2月的日期,这也是mktime(0,0,0,0,2,x)。

下面是一个使用:

使用严格;
使用警告;
使用日期时间;
my$d1=日期时间->新建(月=>1,日=>29,年=>2009);
my$d2=DateTime->new(月=>2,日=>3,年=>2009);
而($d1 strftime(“%m/%d/%Y”),“\n”;
$d1->add(天数=>1);
}

谢谢!这是可行的。这可能需要根据您的环境而定。&Date_Init(“TZ=CST”);是的,DateTime是“规范的”日期模块。请参阅DateTime.perl.orgNice!这些模块的API比Date::Manip更健全。它也比Date::Manip(或DateTime)轻得多.它不能做到DateTime所能做到的一切,但有时简单总比完整好。
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;
}
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);
}