从perl的本地时间获得了一年的理解问题

时间:2016-04-27 18:39:57

标签: perl

我见过许多博客说localtime函数从1900年开始返回年份。 但是对我来说,当我在当前日期添加180天并使用localtime进行打印时,它显示的是2016年的正确年份,而不是116年。

示例:

$today_date=timelocal(0,0,0,27,03,2016);
$seconds=180*60*24*60;
$date=today_date+seconds;
$new_date=localtime(date);
print strftime("%d-%m-%Y",$new_date);

Output:
24-10-2016

当我作为116而不是2016年作为时间本地输入时,它仍然将输出作为2016年。这怎么可能?

1 个答案:

答案 0 :(得分:-2)

您的源代码错误,您错过了变量名前面的$符号。

首先从模块Time::Local调用timelocal,该模块将自1900年以来的年数作为输入,但将2016年作为年份值传递。最后,您将此日期传递回localtime,这正是相反的功能。

试试这个:

print time;
print join(" ",localtime(time));

1461783061
1 51 20 27 3 116 3 117 1

你得到:

  • 第二名
  • 分钟51
  • 小时20
  • 第27天
  • 以零为基础的第3个月是4月
  • 基于1900年的116年,即2016年

localtime的默认用法是:

my @now = localtime(time);
# Convert zero-based-month to calendar month
++$now[4];
# Convert 1900-based-year to calendar year
$now[5] += 1900;

如果您只需要日期计算,请尝试Date::Calc

use Date::Calc qw(Today Add_Delta_Days);

print join '-', Today();
print join '-', Add_Delta_Days(Today(),1);

2016-4-27
2016-4-28

DateTime

use DateTime;

print DateTime->now->add(days => 1, seconds => 180);

2016-04-28T19:00:12

DateTime的{​​{1}}方法或strftime选项会为您提供所需的输出。