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

时间:2012-01-09 16:05:36

标签: perl-module

是否有一个Perl模块可以给我输入月份和年份,比方说,06-2005,这个月的最后一天是什么?对于这个例子,它很容易,因为6月总是有30天,所以最后一天将是30-06-2005。但二月并非如此。所以,如果我有02-1997,我想知道是否要返回28-02-1997或29-02-1997。提前谢谢。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

指定月份的最后一天是下个月的“第0天”。 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'

答案 2 :(得分:0)

正如其他人所说,使用DateTime

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

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