Что такое хороший способ определить даты в диапазоне дат? - PullRequest
4 голосов
/ 11 марта 2009

Что такое хороший модуль Perl (или хороший подход), который возвращает все действительные календарные даты между датой начала и датой окончания?

Например, если у меня 29.01.2009 в качестве начальной даты и 3.02.2009 в качестве конечной, то я бы хотел, чтобы она возвращала массив 30.01.2009, 31.01.2009 1 февраля 2009 года и 2 февраля 2009 года. Должен быть хороший модуль Perl, который уже делает это и учитывает високосные годы, месяцы, но я не могу его найти.

Спасибо за ваши предложения!

Ответы [ 6 ]

9 голосов
/ 11 марта 2009

DateTime , я использовал его много раз, и он может делать практически все, что вы можете себе представить с датами. Он обрабатывает високосные годы, високосные секунды, недопустимые даты / время, может выводить даты в любом формате, может сравнивать, добавлять, вычитать и т. Д. *

Единственная проблема в том, что это может быть излишним.

6 голосов
/ 12 марта 2009

Вот пример использования 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 голосов
/ 11 марта 2009

Вот удар. Требуется 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 голосов
/ 11 марта 2009
2 голосов
/ 11 марта 2009

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");
}
0 голосов
/ 11 марта 2009

Из-за чистой силы 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 ) в последний день февраля любого года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...