2013-09-27 56 views
0

我有一個日期$ time2,並希望增加一個月直到07/01/2015(07/0/2015,07/03/2015,07/04/2015,... )。perl遞增月份與本地時間

以一天增量正常工作:

$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

你可以直接粘貼'$ time2'的值嗎?你想在這裏實現什麼?提及樣品輸入和所需輸出。人們可能會建議更聰明的方法來解決它,而不是僅僅糾正你的錯誤。 – jkshah

+0

您發佈的代碼不會發出該錯誤(或任何輸出(在添加缺少的'使用POSIX qw(strftime);'))之後)。這個錯誤來自'timelocal'或'timegm',你沒有使用它。請提供實際證明您的錯誤的代碼 – ikegami

+0

請注意,並非所有日子都有24小時。 24 * 3600不會一直工作。您應該使用[DateTime](http://search.cpan.org/perldoc?DateTime) – ikegami

回答

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)}; 
}; 
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是非常方便了。

+0

它正在部分工作...二月被跳過!?從一月到三月。 $ VAR1 ='t2:01/30/2021'; $ VAR1 =「T2:2021年3月2日 – mamesaye

+2

什麼日期一月您使用的?你想(二月的最後一天)還是(2021年2月30日)?這可能是使用Time :: Piece或DateTime的一個很好的參數。日期很棘手。 –

+0

謝謝,會的git試試看 – mamesaye

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年3月2日 二零一五年三月三十日 2015年4月30日 ....二○一五年十二月三十〇日 2016年1月30日

仍然會列出13個日期字符串,但第二個和第三個字符串會在3月份指定一個日期。這是因爲3月2日是從1月30日開始的一個月,3月30日是從1月30日開始的兩個月。

這就是生活

+0

不幸的是這種解決方案並不在系統中'date'僅實現POSIX的選項設置工作。例如,在FreeBSD 9上,這行只有使用錯誤。 –

+0

那麼,在FreeBSD上,date命令有不同的原型。這裏是你應該調用的命令:'在{0..12}中爲m;做日期-v7d -v1m -v2015y -v + $ {M} M + '%M /%d /%Y'; done' – superk