2016-08-12 2 views
0

Учитывая эта Эпоха:Почему добавление одного и того же числа в эпоху для разных дат возвращает ту же дату для обоих?

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

Добавления 613 дней (613 * 24 * 3600 секунд) дает :

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

Как это возможно?

+1

Две метки времени не являются 24 часами (86400 секунд) друг от друга, а изменения DST уменьшают разницу, помещая оба результата в тот же день. –

+0

@Jim Garrison, Это неверно. Будучи фактором или 86400 секунд друг от друга, не хуже, чем на расстоянии в 86400 секунд. Проблема полностью в изменении DST, поскольку я ответил за час до того, как вы сделали свой комментарий. – ikegami

ответ

9

В UTC, у всех дней есть 24 часа, поэтому проблема не проявляется при использовании этого часового пояса.

$ TZ=Etc/UTC date [email protected] +'%Y-%m-%d %H:%M:%S' 
2015-03-09 07:00:00 

$ TZ=Etc/UTC date [email protected] +'%Y-%m-%d %H:%M:%S' 
2016-11-11 07:00:00 

Но вы не использовали UTC. Из-за изменений DST не все дни имеют 24 часа во многих часовых поясах. Например, 6 ноября 2016 года было 25 часов в Америке/Los_Angeles, поэтому 1478847600 на час меньше, чем 613 дней позже, чем 1425884400 в этом часовом поясе.

$ TZ=America/Los_Angeles date [email protected] +'%Y-%m-%d %H:%M:%S' 
2015-03-09 00:00:00 

$ TZ=America/Los_Angeles date [email protected] +'%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! 
Смежные вопросы