查找给定月份和特定年份的具体日期

问题描述:

是否有Perl模块可以给我输入月份和年份,比如06-2005,今年这个月的最后一天是什么?对于这个例子,这很容易,因为6月总是有30天,所以最后一天将是30-06-2005。但二月份情况并非如此。所以,如果我有02-1997,我想知道是返回28-02-1997还是29-02-1997。提前致谢。查找给定月份和特定年份的具体日期

+1

看看[DateTime](http://datetime.perl.org)项目。 – 2012-01-09 16:41:54

是的,在Date::Calc模块中有一个子程序Days_in_Month

use strict; 
use warnings; 

use Date::Calc qw/Days_in_Month/; 

for my $m (1 .. 12) { 
    print Days_in_Month(2005, $m), "\n"; 
} 

输出

31 
28 
31 
30 
31 
30 
31 
31 
30 
31 
30 
31 

的最后一天,在一个给定的月份是在下个月的 “零” 的日子。 mktime()采用基于0的月份和基于1900的年份号码,并返回一个纪元时间戳。

use POSIX qw(mktime strftime); 

sub last_day { 
    my ($year, $mon) = @_; 
    return mktime(0,0,0, 0, $mon, $year-1900); 
} 

可以传递到localtimestrftime

say scalar localtime last_day(2005, 5) 
'Tue May 31 00:00:00 2005' 

say scalar localtime last_day(2005, 6) 
'Thu Jun 30 00:00:00 2005' 

say scalar localtime last_day(1997, 2) 
'Fri Feb 28 00:00:00 1997' 

say scalar localtime last_day(2012, 2) 
'Wed Feb 29 00:00:00 2012' 

say (localtime last_day(1997, 2))[3] 
'28' 

say strftime "%d", localtime last_day(1997, 2) 
'28' 

正如有人说,使用DateTime

use DateTime; 
my $dt = DateTime->last_day_of_month('year'=>2000, 'month'=>2); 
print $dt->ymd; # '2000-02-29' 

虽然日期时间可能不是处理日期/时间最快的模块,它绝对是最完整的一个。它也是唯一一个正确处理日期/时间数学的各种怪癖。