Как я могу получить первый и последний день месяца с DateTime Perl?
есть ли способ выяснить первый день месяца (минимальный день) и последний день месяца (максимальный день), учитывая месяц в качестве ввода, используя DateTime
в perl?
до сих пор я выяснил, как пройти в первое свидание, последнее свидание, чтобы дать мне количество дней.
но то, что я хочу сделать сейчас, это просто пройти через месяц в качестве аргумента, скажем 201203
и вернитесь min, maxday.
это возможно с DateTime?
кроме того, я хочу изменить формат даты маска от YYYYMMDD до YYYY-MM-DD.
use strict;
use warnings;
use DateTime;
unless(@ARGV==2)
{
print "Usage: myperlscript first_date last_daten";
exit(1);
}
my ($first_date,$last_date)=@ARGV;
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
5 ответов
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('-');
есть много примеров в "последний день месяца. Короче" на Perlmonks, который я нашел в Гугле "perl datetime последний день месяца".
и вот это Время::Момент пример. Это более компактное и быстрое подмножество DateTime:
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');
удивительно, что ни DateTime
пример использует специальный конструктор last_day_of_month
для этого (пример любезно предоставлен brian 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('-');
в качестве альтернативы есть основной модуль 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
первый день:
$dt->set_day(1);
последний день:
$dt->set_day(1)->add( months => 1 )->subtract( days => 1 );
хотя класс DateTime предлагает конструктор для этого, наиболее эффективный способ получить последний день месяца из существующего объекта DateTime-запросить объект для его вычисления. Класс предоставляет недокументированный метод _month_length (), который вычисляет последний день месяца очень эффективно. С помощью объекта DateTime с именем $date вы можете попробовать
$date->_month_length($date->year,$date->month);
этот метод недокументирован, поэтому он может поддерживаться или не поддерживаться в вашей версии DateTime. Использовать с осторожность.
UPD
начиная с v1.144 DateTime начинает поддерживать month_lenth