0

我有一个日期 $time2 并希望增加一个月,直到 07/01/2015(07/0/2015、07/03/2015、07/04/2015,...)。

增加一天工作正常:

$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 如何解决? 代码在这里

4

4 回答 4

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也很方便。

于 2013-09-27T21:25:06.660 回答
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)};
};
于 2013-09-27T20:55:37.030 回答
0

我会选择使用 bash 的较短版本

for m in {0..12}; do date -ud "01/07/2015 +$m month" +"%m/%d/%Y"; done

结果给出了 13 个日期字符串,每个字符串占一行。您可以使用 $time2 并使用反引号将输出收集到 perl 中。这是输出中的一个示例:

2015 年 1 月 7 日 2015 年 2 月 7 日 ... 2016 年 1 月 7 日

您提到的问题发生在“日期”试图计算距 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 月的日期。这是因为 3 月 2 日与 1 月 30 日相隔一个月,而 3 月 30 日与 1 月 30 日相隔两个月。

这就是生活

于 2013-09-27T23:09:58.953 回答
-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;
}
于 2021-04-08T19:13:19.053 回答