鉴于这些时代:
添加613天(613 * 24 * 3600秒)给出:
这怎么可能?
答案 0 :(得分:9)
在UTC中,所有日子都有24小时,因此在使用该时区时问题并不显现。
$ TZ=Etc/UTC date --date=@1425884400 +'%Y-%m-%d %H:%M:%S'
2015-03-09 07:00:00
$ TZ=Etc/UTC date --date=@1478847600 +'%Y-%m-%d %H:%M:%S'
2016-11-11 07:00:00
但你没有使用UTC。由于DST的变化,并非所有日子在许多时区都有24小时。例如,2016年11月6日美国/洛杉矶的长度为25小时,因此1478847600比该时区的1425884400短613天一小时。
$ TZ=America/Los_Angeles date --date=@1425884400 +'%Y-%m-%d %H:%M:%S'
2015-03-09 00:00:00
$ TZ=America/Los_Angeles date --date=@1478847600 +'%Y-%m-%d %H:%M:%S'
2016-11-10 23:00:00
使用DateTime等模块可以避免这些问题。
$ perl -e'
use DateTime qw( );
my $dt = DateTime->from_epoch(
epoch => 1425884400,
time_zone => "America/Los_Angeles", # Often "local"
);
CORE::say( $dt );
$dt->add( days => 613 );
CORE::say( $dt );
CORE::say( $dt->epoch );
'
2015-03-09T00:00:00
2016-11-11T00:00:00
1478851200 # Not 1478847600!