为什么perl的本地时间似乎输出错误的月份?

Dee*_*ool 2 perl date

我已经看到了其他答案,但由于某种原因,它们并不适合我.

我试图使用以下代码在Perl脚本中获取昨天的日期.

供将来参考,今天的日期是2015年11月12日

my (undef, undef, undef, $mday,$mon,$year) = localtime();
my $prev_day = timelocal(0, 0, 0, $mday-1, $mon, $year);
(undef, undef, undef, $mday,$mon,$year) = localtime($prev_day);
$year += 1900;

print "Yesterday's Day: $mday, Month: $mon, Year: $year\n";
Run Code Online (Sandbox Code Playgroud)

除了我的输出看起来像这样

Yesterday's Day: 11, Month: 10, Year: 2015.
Run Code Online (Sandbox Code Playgroud)

我应该读昨天的日期Day: 11, Month: 11, Year: 2015.为什么减去月份?

编辑:这与建议的答案不同,因为我想知道为什么当地时间似乎写错了月份.

Bor*_*din 7

对文件localtime说,这

$ mday是月份中的一天,而月份中的$ mon是0..11,0表示1月,11表示12月.

因此,要获得一月所需的1月份数$mon+1,或者您可以$mday在添加1900时同时添加一个$year

像这样

use strict;
use warnings 'all';

use Time::Local;

my ($y, $m, $d) = (localtime)[5,4,3];

my $yesterday = timelocal(0, 0, 0, $d-1, $m, $y);
($y, $m, $d) = (localtime($yesterday))[5,4,3];
$y += 1900;
++$m;

print "Yesterday's Day: $d, Month: $m, Year: $y\n";
Run Code Online (Sandbox Code Playgroud)

产量

Yesterday's Day: 11, Month: 11, Year: 2015
Run Code Online (Sandbox Code Playgroud)

更好的方法是使用核心库Time::Piece这样

use strict;
use warnings 'all';

use Time::Piece;
use Time::Seconds 'ONE_DAY';

my $yesterday = localtime() - ONE_DAY;

printf "Yesterday's Day: %d, Month: %d, Year: %d\n",
    $yesterday->mday,
    $yesterday->mon,
    $yesterday->year;
Run Code Online (Sandbox Code Playgroud)

产量

Yesterday's Day: 11, Month: 11, Year: 2015
Run Code Online (Sandbox Code Playgroud)

  • 从日期中减去一天只会在一个月的第一天起作用. (2认同)