为什么在不同日期的纪元时间添加相同的数字会为两者返回相同的日期?

时间:2016-08-12 21:52:11

标签: perl

鉴于这些时代:

  • 1425801600(2015-03-08)
  • 1425884400(2015-03-09)

添加613天(613 * 24 * 3600秒)给出:

  • 1478764800(2016-11-10)
  • 1478847600(2016-11-10)

这怎么可能?

1 个答案:

答案 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!