Найти конкретный день данного месяца и данного года - PullRequest
0 голосов
/ 09 января 2012

есть ли модуль Perl, который может дать мне данные для ввода месяца и года, скажем, 06-2005, каков последний день этого месяца в этом году? Для этого примера это легко, потому что в июне всегда 30 дней, поэтому последний день будет 30-06-2005. Но это не относится к февралю. Итак, если у меня есть 02-1997, я хотел бы знать, вернуться ли 28-02-1997 или 29-02-1997. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 30 марта 2012

Последний день в данном месяце - это "0-й" день следующего месяца. 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'
0 голосов
/ 25 декабря 2012

Как уже говорили другие, используйте DateTime:

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

Хотя DateTime, возможно, и не самый быстрый модуль для обработки дат / времени, он определенно является наиболее полным. Это также единственный, который правильно обрабатывает различные причуды математики даты / времени.

0 голосов
/ 22 января 2012

Да, в модуле 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";
}

OUTPUT

31
28
31
30
31
30
31
31
30
31
30
31
...