perl增量月与localtime
我有一个日期$time2,希望增加一个月,直到2015年1月7日(2015年0月7日、2015年3月7日、2015年4月7日……) 增加一天即可正常工作:perl增量月与localtime,perl,date,Perl,Date,我有一个日期$time2,希望增加一个月,直到2015年1月7日(2015年0月7日、2015年3月7日、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
$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'超出范围0..11
如何修复它?
此处代码:
#!/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)};
};
#/usr/bin/perl
严格使用;
使用整数;
亚udt2st{
我的$t=班次;
my($y,$m,$d)=(localtime($t))[5,4,3];$y+=1900;$m++;
返回[$y*10000+$m*100+$d、$y、$m、$d];
};
我的$starttime=时间();
我的($yyyymmdd,$y,$m,$d)=@{&udt2st($starttime)};
而($yyyymmdd<20150701){
#
打印sprintf(qq/%s%04d-%02d-%02d\n/,$yyyyymmdd,$y,$m,$d);#在此处打印工作内容
#
我的$il=($y+3)%4/3)>>($y+99)%100/99);#是leap吗?
我的$md=30+($m+$m/8)%2)-($m+9)%12)/11*(2-$il)#本月最长天数
$starttime+=($md-$d)+$d)*86400;
($yyyymmdd,$y,$m,$d)=@{&udt2st($starttime)};
};
我可能会这样做:
#!/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
也非常方便。我会选择使用bash的较短版本
for m in {0..12}; do date -ud "01/07/2015 +$m month" +"%m/%d/%Y"; done
结果给出了13个日期字符串,每个字符串都在自己的行上。您可以使用$time2并使用backticks将输出收集到perl中。以下是输出中的一个示例:
2015年7月1日2015年7月2日
... 2016年7月1日
您提到的问题发生在“日期”试图计算1月30日后一个月的某一天时。这里有一个例子
for m in {0..12}; do date -ud "01/30/2015 +$m month" +"%m/%d/%Y"; done
2015年1月30日
03/02/2015
03/30/2015
04/30/2015
.... 12/30/2015
2016年1月30日
仍将列出13个日期字符串,但第二个和第三个字符串将日期定为3月份。这是因为3月2日距离1月30日还有一个月,3月30日距离1月30日还有两个月
这就是生活/usr/bin/perl
使用POSIX qw(mktime strftime);
我的$year\u from\u now=getDateYearFromNow(“%Y%m%d”);
出口
sub getDateYearFromNow
{
我的($格式)=@;
my@now=localtime();
$now[3]+=365;##同一时间,1年后
my$f=strftime$格式,localtime(mktime(@now));
返回$f;
}
您能按原样粘贴
$time2
的值吗?你在这里想要实现什么?提及示例输入和所需输出。人们可能会建议更聪明的方法来解决它,而不仅仅是纠正错误。您发布的代码不会出现错误(或任何输出(添加缺少的后使用POSIX qw(strftime);
)。该错误来自您未使用的timelocal
或timegm
。请提供实际演示错误的代码注意,并非所有的日子都有24小时。24*3600并不总是有效。您应该使用@jkshah:$time2不是一个可读的日期值(1690948800),这就是为什么我使用localtime来格式化it@mamesaye我是使用本地时间得到的。我不想读它。我想在我这边尝试一下你的代码,并且需要给出相同的输入。谢谢它正在部分工作。。。二月被跳过了!?从一月到三月$VAR1='t2:01/30/2021'$VAR1='t2:03/02/2021您使用的是1月份的哪个日期?你想要(二月的最后一天)还是(2021年2月30日)?这可能是使用Time::Piece
或DateTime
的一个很好的理由。约会是很棘手的。谢谢,会不会给我一次约会时间对我来说很有用<代码>我的$dt=DateTime->new(年=>$tval22[0],月=>$tval22[1],日=>$tval22[2])$dt->add(月=>1,月底=>limit)再次感谢code>这个解决方案在date
仅实现POSIX选项集的系统上不起作用。例如,在FreeBSD 9上,这一行仅存在使用错误。在FreeBSD上,date命令具有不同的原型。下面是您应该调用的命令:{0..12}中m的;do date-v7d-v1m-v2015y-v+${m}m+'%m/%d/%Y';完成