2012-03-30 89 views
9

在perl中使用DateTime來計算月份的第一天(分鐘日期)和月份的最後一天(max day),是否有方法計算該月份作爲輸入?如何用Perl的DateTime得到本月的第一天和最後一天?

到目前爲止,我想出瞭如何在第一個日期,最後一個日期給我一個日期範圍。

但是我現在要做的只是在一個月內作爲參數傳遞,說201203並返回最小值,最大值。

這可能與DateTime?

此外,我想將日期格式掩碼從YYYYMMDD更改爲YYYY-MM-DD。

use strict; 
    use warnings; 
    use DateTime; 

    unless(@ARGV==2) 
    { 
     print "Usage: myperlscript first_date last_date\n"; 
     exit(1); 
    } 

    my ($first_date,$last_date)[email protected]; 

    my $date=DateTime->new(
    { 
     year=>substr($first_date,0,4), 
     month=>substr($first_date,4,2), 
     day=>substr($first_date,6,2) 
    }); 


while($date->ymd('') le $last_date) 
{ 
    print $date->ymd('') . "\n"; 
    #$date->add(days=>1); #every day 
    $date->add(days=>30); 
} 

預期結果:

2012-03-01 
2012-03-31 
+3

民主日總是1! – theglauber 2012-03-30 20:52:59

回答

14

DateTime確實日期數學你。你可以告訴你想要作爲分隔符使用ymd的字符:

use DateTime; 

my($year, $month) = qw(2012 2); 

my $date = DateTime->new(
    year => $year, 
    month => $month, 
    day => 1, 
); 

my $date2 = $date->clone; 

$date2->add(months => 1)->subtract(days => 1); 

say $date->ymd('-'); 
say $date2->ymd('-'); 

有在"Last day of the month. Any shorter"很多例子上Perlmonks,我發現谷歌搜索"perl datetime last day of month"


這裏是一個Time::Moment的例子。這是日期時間的一個更精簡,更快速的子集:

use v5.10; 
use Time::Moment; 

my($year, $month) = qw(2012 2); 

my $tm = Time::Moment->new(
    year => $year, 
    month => $month, 
    day => 1, 
); 

my $tm2 = $tm->plus_months(1)->minus_days(1); 

say $tm->strftime('%Y-%m-%d'); 
say $tm2->strftime('%Y-%m-%d'); 
6

第一天:

$dt->set_day(1); 

最後一天:

$dt->set_day(1)->add(months => 1)->subtract(days => 1); 
+8

如果你想避免改變'$ dt',不要忘記調用'clone'。 – ikegami 2012-03-30 20:50:45

8

作爲替代有Perl核心模塊Time::Piece

對於目前的月和年:

perl -MTime::Piece -wE '$t=localtime;say $t->month_last_day' 
31 

更一般地,是這樣的:

use 5.010; 
use Time::Piece; 
my $MY = shift || die "Month and Year expected\n"; 
my $t = Time::Piece->strptime($MY, "%m%Y"); 
say $t->month_last_day; 

$ ./mycode 022012 
29 
9

令人驚訝的是,既不DateTime示例使用了特殊的構造last_day_of_month(布萊恩·d FOY的例子提供):

use DateTime; 
use strict; 
use 5.010; 

my($year, $month) = qw(2012 2); 

my $date = DateTime->new(
    year => $year, 
    month => $month, 
    day => 1, 
); 

my $date2 = DateTime->last_day_of_month( 
    year => $date->year, 
    month => $date->month, 
); 

say $date->ymd('-'); 
say $date2->ymd('-'); 
0

雖然日期時間類提供了一個構造函數來完成此操作,從現有DateTime對象獲取月份的最後一天的最有效方法是請求對象計算它。該類公開了一個未記錄的方法_month_length(),該方法非常高效地計算了月份的最後一天。有了您的DateTime對象調用$日期,你可以嘗試

$date->_month_length($date->year,$date->month); 

這種方法是無證,因此它可能會或可能不會在您的日期時間版本支持。謹慎使用。

相關問題