Не волнуйтесь, использование java.time
- Видимо вы используете библиотеку Joda-Time. Вместо этого используйте java.time.
- Java.классы времени автоматически обрабатывают переходы на летнее время (DST).
- Вам не нужно ничего делать, кроме как поддерживать JVM в актуальном состоянии с изменениями tzdata time zone database, которые могут повлиять на ваши часовые пояса. См. Обновления Oracle’s provided tool for tzdata.
java.time
Давайте посмотрим на результаты добавления шести часов с помощью классов java.time.
Определите дату и время суток.
LocalDate ld = LocalDate.of (2015, Month.OCTOBER, 24); // 24th Oct 2015 at 10:00am per the Question.
LocalTime lt = LocalTime.of (10, 0);
Определение часового пояса, а ZoneId
объект, для Europe/London
.
ZoneId z = ZoneId.of ("Europe/London");
Комбинировать, чтобы создать объект ZonedDateTime
.
ZonedDateTime zdtStart = ZonedDateTime.of (ld, lt, z);
Извлечение Instant
из ZonedDateTime
. Класс Instant
представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).
Instant instantStart = zdtStart.toInstant ();
Определить наш промежуток времени, шесть часов, как Duration
. Классы java.time могут выполнять математику с датой и временем, добавляя объект Duration
.
A Duration
не привязан к временной шкале и фактически хранит несколько секунд и несколько наносекунд. Таким образом, в этом классе нет никаких умений «шесть часов», часов и летнего времени и т. Д. Когда мы запрашиваем Duration
из шести часов, этот класс немедленно вычисляет (6 часов * 60 минут в час * 60 секунд в минуту) = 21 600 секунд в общей сложности.
Duration sixHours = Duration.ofHours (6); // 21,600 seconds = (6 hours * 60 minutes per hour * 60 seconds per minute).
Петля десять раз. Первый цикл, добавив Duration
к ZonedDateTime
и преобразуйте результат в Instant
.
// Increment the `ZonedDateTime`.
ZonedDateTime zdt = zdtStart;
for (int i = 1 ; i <= 10 ; i++) {
System.out.println (">zdt.toString() " + zdt + " | zdt.toInstant().toString(): " + zdt.toInstant () + "\n");
// Set up next loop.
zdt = zdt.plus (sixHours);
}
При запуске. Обратите внимание на скачок во времени дня в Лондонское время. Это осень Daylight Saving Time (DST) осенью, когда осенью осень возвращается к стандартному времени, начиная со смещения от UTC +01:00
до смещения Zulu +00:00
, где в 2 часа ночи часы возвращаются, чтобы повторить 1 AM час. Поэтому, когда мы ожидали бы 22:00 плюс шесть часов, чтобы выйти в 4 часа ночи, вместо этого мы увидим 3 часа ночи. В значении Instant
вы можете увидеть, что действительно прошло шесть часов. Хитрость заключалась в том, что лондонцы ранили назад свои часы в течение часа.
См. history of DST cutovers за Europe/London
.
zdt.toString() 2015-10-24T10: 00 + 01: 00 [Европа/Лондон] | zdt.toInstant(). toString(): 2015-10-24T09: 00: 00Z
zdt.toString() 2015-10-24T16: 00 + 01: 00 [Европа/Лондон] | zdt.toInstant(). toString(): 2015-10-24T15: 00: 00Z
zdt.toString() 2015-10-24T22: 00 + 01: 00 [Европа/Лондон] | zdt.toInstant().toString(): 2015-10-24T21: 00: 00Z
zdt.toString() 2015-10-25T03: 00Z [Европа/Лондон] | zdt.toInstant(). toString(): 2015-10-25T03: 00: 00Z
zdt.toString() 2015-10-25T09: 00Z [Европа/Лондон] | zdt.toInstant(). toString(): 2015-10-25T09: 00: 00Z
zdt.toString() 2015-10-25T15: 00Z [Европа/Лондон] | zdt.toInstant(). toString(): 2015-10-25T15: 00: 00Z
zdt.toString() 2015-10-25T21: 00Z [Европа/Лондон] | zdt.toInstant(). toString(): 2015-10-25T21: 00: 00Z
zdt.toString() 2015-10-26T03: 00Z [Европа/Лондон] | zdt.toInstant(). toString(): 2015-10-26T03: 00: 00Z
zdt.toString() 2015-10-26T09: 00Z [Европа/Лондон] | zdt.toInstant(). toString(): 2015-10-26T09: 00: 00Z
zdt.toString() 2015-10-26T15: 00Z [Европа/Лондон] | . Zdt.toInstant() ToString(): 2015-10-26T15: 00: 00Z
Для удовольствия мы подкачки, добавив шесть часов подряд, чтобы Instant
и конвертировать результат в лондонскому времени.
// Increment the `Instant`.
Instant instant = instantStart;
for (int i = 1 ; i <= 10 ; i++) {
System.out.println (">instant.toString() " + instant + " | instant.atZone(z).toString(): " + instant.atZone (z) + "\n");
// Set up next loop.
instant = instant.plus (sixHours);
}
При запуске мы видим одинаковые значения.
instant.toString() 2015-10-24T09: 00: 00Z | instant.atZone (z) .toString(): 2015-10-24T10: 00 + 01: 00 [Европа/Лондон]
instant.toString() 2015-10-24T15: 00: 00Z | instant.atZone (z) .toString(): 2015-10-24T16: 00 + 01: 00 [Европа/Лондон]
instant.toString() 2015-10-24T21: 00: 00Z | instant.atZone (z) .toString(): 2015-10-24T22: 00 + 01: 00 [Европа/Лондон]
instant.toString() 2015-10-25T03: 00: 00Z | instant.atZone (z) .toString(): 2015-10-25T03: 00Z [Европа/Лондон]
instant.toString() 2015-10-25T09: 00: 00Z | instant.atZone (z) .toString(): 2015-10-25T09: 00Z [Европа/Лондон]
instant.toString() 2015-10-25T15: 00: 00Z | instant.atZone (z) .toString(): 2015-10-25T15: 00Z [Европа/Лондон]
instant.toString() 2015-10-25T21: 00: 00Z | instant.atZone (z) .toString(): 2015-10-25T21: 00Z [Европа/Лондон]
instant.toString() 2015-10-26T03: 00: 00Z | instant.atZone (z) .toString(): 2015-10-26T03: 00Z [Европа/Лондон]
instant.toString() 2015-10-26T09: 00: 00Z | instant.atZone (z) .toString(): 2015-10-26T09: 00Z [Европа/Лондон]
instant.toString() 2015-10-26T15: 00: 00Z | instant.atZone (г) .ToString(): 2015-10-26T15: 00Z [Europe/London]
Смотрите эту code run live at IdeOne.com.
О java.время
Рамка java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.
Где получить классы java.time?
- Java SE 8 и SE 9, а затем
- Встроенный.
- Часть стандартного Java API с объединенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
- Android
ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
Что вы подразумеваете под "пристройкой"? Было бы очень полезно, если бы вы показали короткую, но полную программу, демонстрирующую проблему, включая фактический вывод и ожидаемый результат. –
Добавил больше информации в сообщение. – MisterIbbs
Вы не добавили короткий, но полный пример, хотя это то, что я действительно хотел бы увидеть ... –