查找给定月份和特定年份的具体日期
问题描述:
是否有Perl模块可以给我输入月份和年份,比如06-2005,今年这个月的最后一天是什么?对于这个例子,这很容易,因为6月总是有30天,所以最后一天将是30-06-2005。但二月份情况并非如此。所以,如果我有02-1997,我想知道是返回28-02-1997还是29-02-1997。提前致谢。查找给定月份和特定年份的具体日期
答
是的,在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);
}
可以传递到localtime
或strftime
。
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'
虽然日期时间可能不是处理日期/时间最快的模块,它绝对是最完整的一个。它也是唯一一个正确处理日期/时间数学的各种怪癖。
看看[DateTime](http://datetime.perl.org)项目。 – 2012-01-09 16:41:54