В 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!
Две метки времени не являются 24 часами (86400 секунд) друг от друга, а изменения DST уменьшают разницу, помещая оба результата в тот же день. –
@Jim Garrison, Это неверно. Будучи фактором или 86400 секунд друг от друга, не хуже, чем на расстоянии в 86400 секунд. Проблема полностью в изменении DST, поскольку я ответил за час до того, как вы сделали свой комментарий. – ikegami