Смотрите Эту страницу, чтобы узнать подробности о 1927 году в Шанхае. По сути, в полночь в конце 1927 года часы перешли на 5 минут 52 секунды назад. Итак, "1927-12-31 23: 54: 08" на самом деле произошло дважды, и похоже, что Java анализирует его как более поздний возможный момент для этой локальной даты / времени - отсюда разница.
Просто еще один эпизод в часто странном и удивительном мире часовых поясов.
Если перестроить с использованием версии 2013a TZDB, исходный вопрос больше не будет демонстрировать такое же поведение. В 2013a результатом было бы 358 секунд, со временем перехода 23:54: 03 вместо 23:54: 08.
Я заметил это только потому, что собираю подобные вопросы в Noda Time в форме модульных тестов... Теперь тест изменен, но это просто показывает - даже исторические данные небезопасны.
В TZDB 2014f время изменения переместилось на 1900-12-31, и теперь это изменение занимает всего 343 секунды (таким образом, время между t и t+1 составляет 344 секунды, если вы понимаете, что я имею в виду).
Чтобы ответить на вопрос о переходе в 1900 году... похоже, что реализация часового пояса Java рассматривает все часовые пояса как просто находящиеся в их стандартном времени в любой момент до начала 1900 UTC:
import java.util.TimeZone;
publicclassTest { publicstaticvoidmain(String[] args)throws Exception { longstartOf1900Utc= -2208988800000L; for (String id : TimeZone.getAvailableIDs()) { TimeZonezone= TimeZone.getTimeZone(id); if (zone.getRawOffset() != zone.getOffset(startOf1900Utc - 1)) { System.out.println(id); } } } }
Приведенный выше код не выдает выходных данных на моем компьютере с Windows. Таким образом, любой часовой пояс, который имеет какое-либо смещение, отличное от стандартного в начале 1900 года, будет считаться переходом. У самой TZDB есть некоторые данные, относящиеся к более раннему периоду, и она не опирается на какую-либо идею "фиксированного" стандартного времени (что getRawOffset считается допустимой концепцией), поэтому другим библиотекам не нужно вводить этот искусственный переход.
Когда местное стандартное время приближалось к воскресенью, 1 января 1928 года, 00: 00: 00, часы были переведены назад на 0: 05: 52 часов до субботы, 31. Декабрь 1927, 23:54:08 по местному стандартному времени вместо
Это не особенно странно и происходило практически везде в то или иное время, когда часовые пояса менялись из-за политических или административных действий.
Ответ 3
Мораль этой странности такова:
Везде, где это возможно, используйте даты и время в UTC.
Если вы не можете отобразить дату или время в UTC, всегда указывайте часовой пояс.
Если вы не можете потребовать ввода даты / времени в UTC, требуйте явно указанного часового пояса.
Ответ 4
При увеличении времени вы должны преобразовать обратно в UTC, а затем добавить или вычесть. Используйте местное время только для отображения.
Таким образом, вы сможете просмотреть любые периоды, когда часы или минуты повторяются дважды.
Если вы преобразовали в UTC, добавьте каждую секунду и преобразуйте в местное время для отображения. Вы бы прошли через 11:54: 08 вечера LMT - 11:59:59 вечера LMT, а затем 11:54: 08 вечера CST - 11:59: 59 вечера CST.