代码之家  ›  专栏  ›  技术社区  ›  NoahD

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

  •  4
  • NoahD  · 技术社区  · 15 年前

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

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

    谢谢你的建议!

    6 回复  |  直到 15 年前
        1
  •  2
  •   vasi    15 年前

    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");
    }
    
        2
  •  9
  •   Ben S    15 年前

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

    唯一的问题是它可能是杀伤力过大。

        3
  •  6
  •   runrig    15 年前

    下面是一个使用 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);
    }
    
        4
  •  4
  •   Telemachus MrJames    15 年前

    这是刺戳。它需要 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
    }
    
        5
  •  3
  •   Chris Ballance    15 年前
        6
  •  0
  •   Axeman maxelost    15 年前

    因为 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 ) 具有意义。但是这个也是 mktime( 0, 0, 0, 0, 2, x ) 任何一年的最后一个2月的日期。