2009-03-11 5 views
4

Was ist ein gutes Perl-Modul (oder guter Ansatz), das alle gültigen Kalenderdaten zwischen einem Startdatum und einem Enddatum zurückgibt?Was ist eine gute Möglichkeit, Daten in einem Datumsbereich zu bestimmen?

Zum Beispiel, wenn ich 29.01.2009 als Startdatum und 2/3/2009 als Enddatum habe, dann möchte ich ein Array vom 30.01.2009, 31.01.2009 zurückgeben , 01.02.2009 und 02.02.2009. Es muss ein gutes Perl-Modul geben, das dies bereits tut und Schaltjahre, Monate berücksichtigt, aber ich kann es nicht finden.

Vielen Dank für Ihre Vorschläge!

Antwort

2

Date::Manip scheint das kanonische Datumsmodul in Perl zu sein. Es hat eine seltsame API, aber es funktioniert. Hier ist ein Beispiel für die Verwendung der ParseRecur-Funktion zu tun, was Sie wollen:

#!/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

Danke! Das funktioniert. Dies kann abhängig von Ihrer Umgebung erforderlich sein. & Datum_Init ("TZ = CST"); – NoahD

9

DateTime, ich habe es oft verwendet, und es kann so ziemlich alles tun können Sie mit Terminen denken. Es handhabt Schaltjahre, Schaltsekunden, ungültige Daten/Zeiten, es kann Daten in jedem Format ausgeben, es kann vergleichen, addieren, subtrahieren, etc ...

Das einzige Problem ist, dass es vielleicht übertrieben ist.

+0

Ja Datetime das "kanonische" date-Modul ist. Siehe datetime.perl.org – draegtun

4

Hier ist ein Stich. Es erfordert Date::Simple und 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 
} 
+0

Schön! Diese Module haben eine viel klarere API als Date :: Manip. – vasi

+0

Es ist auch deutlich leichter als Date :: Manip (oder DateTime). Es kann nicht alles, was DateTime kann, aber manchmal ist einfach besser als abgeschlossen. – Telemachus

0

Aufgrund der ordentlichen Leistung von POSIX::mktime, können Sie folgendes tun:

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; 
} 

Mit mktime(0, 0, 0, 500, 0, 108) Bedeutung hat. Aber dann tut dies auch mktime(0, 0, 0, 0, 2, x) für das letzte Datum des Februar für ein Jahr.

6

Hier ist ein Beispiel unter Verwendung von 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); 
}