2009-03-11 20 views
4

有効なカレンダーの日付を開始日から終了日までの間に返す良いPerlモジュールとは何ですか?日付範囲内の日付を判断するにはどうすればよいですか?

たとえば、開始日に1/29/2009、終了日に2/3/2009がある場合は、1/30/2009、1/31/2009の配列を返したいと思います、2009年2月1日、および2/2/2009。すでにこれを行い、うるう年、数ヶ月のアカウントを持っている良いPerlモジュールがなければなりませんが、見つけられません。

お寄せいただきありがとうございます!

答えて

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"); 
} 
+0

ありがとう!これは機能します。これは、ご使用の環境によっては必要になる場合があります。 &Date_Init( "TZ = CST"); – NoahD

3

パッケージは

9

DateTimeDate::DateCalc、私はそれを何度も使ってきたし、それはあなたが日付と考えることができますほとんど何でも行うことができます。それは閏年、うるう秒、無効な日付/時刻を処理し、任意の形式で日付を出力し、比較、加算、減算などを行うことができます。

唯一の問題は、

+0

はい日時が "正規" の日付のモジュールです。 datetime.perl.orgを参照してください – draegtun

4

ここではスタブです。それはDate::SimpleDate::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

ニース!これらのモジュールはDate :: Manipよりもはるかにsaner APIを持っています。 – vasi

+0

Date :: Manip(またはDateTime)よりも大幅に軽量です。 DateTimeができることすべてを行うことはできませんが、時にはシンプルが完了するよりも優れています。 – Telemachus

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)です。

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); 
} 
関連する問題