我有一个日期$ time2,并希望增加一个月到2015年1月7日(2015年7月1日,2015年3月3日,2015年4月7日,...)。
增加一天工作正常:
$t2 = strftime( "%m/%d/%Y", localtime( $time2 + 24 * 3600)); # 07/01/2013
增加一个月我有一个错误:
my $t02 = strftime( "%m/%d/%Y", localtime( $time2 + 0 * 3600));
my @t22 = ($t02 =~ m|(\d{2})/(\d{2})/(\d{4})| );
$t22[1]++;
$t2 = $t22[0]."/".$t22[1]."/".$t22[1];
有错误Month '-1' out of range 0..11
怎么解决?
codei HERE
答案 0 :(得分:3)
我可能会这样做:
#!/usr/bin/perl
use warnings;
use strict;
use POSIX qw(strftime mktime);
my $time2 = 1690948800;
my @parts = localtime $time2;
$parts[4]++; # increment month
print strftime('%m/%d/%Y', localtime $time2), "\n";
print strftime('%m/%d/%Y', localtime mktime @parts), "\n";
但Time::Piece
非常方便。
答案 1 :(得分:0)
这里代码:
#!/usr/bin/perl
use strict;
use integer;
sub udt2st {
my $t = shift;
my ($y, $m, $d) = (localtime($t))[5, 4, 3]; $y += 1900; $m++;
return [$y * 10000 + $m * 100 + $d, $y, $m, $d];
};
my $starttime = time();
my ($yyyymmdd, $y, $m, $d) = @{&udt2st($starttime)};
while ($yyyymmdd < 20150701) {
#
print sprintf(qq/%s %04d-%02d-%02d\n/, $yyyymmdd, $y, $m, $d); # working stuff here
#
my $il = (($y + 3) % 4 / 3) >> (($y + 99) % 100 / 99); # is leap?
my $md = 30 + (($m + $m / 8) % 2) - (($m + 9) % 12) / 11 * (2 - $il); # max. day in this month
$starttime += (($md - $d) + $d) * 86400;
($yyyymmdd, $y, $m, $d) = @{&udt2st($starttime)};
};
答案 2 :(得分:0)
我选择使用bash的短版本
for m in {0..12}; do date -ud "01/07/2015 +$m month" +"%m/%d/%Y"; done
结果给出了13个日期字符串,每个字符串各自独立。您可以使用$ time2并使用反引号将输出收集到perl中。以下是输出中的示例:
01/07/2015 02/07/2015 ... 01/07/2016
你提到的问题发生在'date'试图计算距离1月30日一个月的一天时。这是一个例子
for m in {0..12}; do date -ud "01/30/2015 +$m month" +"%m/%d/%Y"; done
2015年1月30日 2015年3月2日 2015年3月30日 2015年4月30日 .... 2015年12月30日 2016年1月30日
仍会列出13个日期字符串,但第二个和第三个日期字符串表示三月份的日期。这是自3月2日起1月30日起1个月,3月30日距离1月30日还有2个月。
那是生命
答案 3 :(得分:-2)
#!/usr/bin/perl
use POSIX qw(mktime strftime);
my $year_from_now = getDateYearFromNow("%Y%m%d");
exit;
sub getDateYearFromNow
{
my ($format) = @_;
my @now = localtime();
$now[3] += 365; ## same time, 1 year from now
my $f = strftime $format, localtime(mktime(@now));
return $f;
}