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

add*_*sas 0 perl

鉴于这些时代:

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

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

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

这怎么可能?

ike*_*ami 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
Run Code Online (Sandbox Code Playgroud)

但你没有使用UTC.由于DST的变化,并非所有日子在许多时区都有24小时.例如,2016年11月6日在America/Los_Angeles长达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
Run Code Online (Sandbox Code Playgroud)

使用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!
Run Code Online (Sandbox Code Playgroud)