perl增量月份与localtime

时间:2013-09-27 20:02:36

标签: perl date

我有一个日期$ 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

4 个答案:

答案 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;
}