有没有办法找出月份的第一天(最小的一天)和一个月的最后一天(最大的一天),给定月份作为输入,使用DateTimeperl?
到目前为止,我想出了如何传递第一个日期,最后一个日期给我一系列日子.
但我现在要做的只是作为一个论点传递一个月,201203并且返回min,maxday.
这可能与DateTime有关吗?
另外,我想将日期格式掩码从YYYYMMDD更改为YYYY-MM-DD.
use strict;
use warnings;
use DateTime;
unless(@ARGV==2)
{
print "Usage: myperlscript first_date last_date\n";
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);
}
Run Code Online (Sandbox Code Playgroud)
预期成绩:
2012-03-01
2012-03-31
Run Code Online (Sandbox Code Playgroud)
bri*_*foy 17
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('-');
Run Code Online (Sandbox Code Playgroud)
在Perlmonks的"最后一天.任何更短的"中有很多例子,我通过Google搜索"perl datetime of month"找到了这个例子.
这是一个Time :: Moment示例.它是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');
Run Code Online (Sandbox Code Playgroud)
w.k*_*w.k 13
令人惊讶的是,这两个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('-');
Run Code Online (Sandbox Code Playgroud)
作为替代方案,有核心Perl模块Time::Piece.
对于当前月份和年份:
perl -MTime::Piece -wE '$t=localtime;say $t->month_last_day'
31
Run Code Online (Sandbox Code Playgroud)
更一般地说,像:
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
Run Code Online (Sandbox Code Playgroud)
第一天:
$dt->set_day(1);
Run Code Online (Sandbox Code Playgroud)
最后一天:
$dt->set_day(1)->add( months => 1 )->subtract( days => 1 );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17165 次 |
| 最近记录: |