Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl增量月与localtime_Perl_Date - Fatal编程技术网

perl增量月与localtime

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

我有一个日期$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 =~ 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)这个解决方案在
date
仅实现POSIX选项集的系统上不起作用。例如,在FreeBSD 9上,这一行仅存在使用错误。在FreeBSD上,date命令具有不同的原型。下面是您应该调用的命令:{0..12}中m的
;do date-v7d-v1m-v2015y-v+${m}m+'%m/%d/%Y';完成