В эквиваленте используется специальный метод atStartOfDay в классе LocalDate
:
ZoneId zoneId = ZoneId.of("America/New_York");
ZonedDateTime zdt = LocalDate.now(zoneId).atStartOfDay(zoneId);
Также обратите внимание, что эквивалент Joda-Time _ 3_ не является _ 4_, но _ 5_. Здесь имеет значение параметр zoneId
. Конкретный пример миграции - см. Также веб-сайт часовых поясов для получения дополнительной информации о переход на летнее время в Бразилии:
Джода-Тайм (старый способ)
DateTime dt =
new DateTime(2015, 10, 18, 12, 0, DateTimeZone.forID("America/Sao_Paulo"));
dt = dt.withTimeAtStartOfDay();
System.out.println(dt); // 2015-10-18T01:00:00.000-02:00
Обратите внимание, что этот код даже вызовет исключение для полуночи в первой строке с вызовом конструктор.
java.time (новый способ)
ZoneId zoneId = ZoneId.of("America/Sao_Paulo");
ZonedDateTime zdt =
ZonedDateTime.of(2015, 10, 18, 12, 0, 0, 0, zoneId);
zdt = zdt.toLocalDate().atStartOfDay(zoneId);
System.out.println(zdt); // 2015-10-18T01:00-02:00[America/Sao_Paulo]
Второй оператор программы ведет себя иначе, чем Joda-Time, потому что он не генерирует исключение, а незаметно сдвигает местное время на размер рассматриваемого промежутка, здесь на один час. Это означает, что если бы вы выбрали полночь, результат был бы таким же (а именно 1:00). Если бы вы выбрали 00:30, то результат был бы 01:30. В приведенном выше примере в качестве входных данных выбран полдень.
Чтобы процитировать документ для ZonedDateTime.of (…):
В большинстве случаев существует только одно допустимое смещение для локальной даты и времени. В случае перекрытия, когда часы возвращаются назад, есть два действительных смещения. В этом методе используется более раннее смещение, обычно соответствующее лету.
В случае разрыва, когда часы перескакивают вперед, нет действительного смещения. Вместо этого местная дата-время корректируется так, чтобы соответствовать длине промежутка. При типичном переходе на летнее время на один час местная дата-время будет сдвинута на час позже в смещение, обычно соответствующее летнему периоду.
100% -ная миграция всех деталей, таких как поведение исключений и применяемые стратегии перехода на летнее время, невозможна, потому что обе библиотеки слишком разные. Но это ваша рекомендация:
- заменить
DateTime
на ZonedDateTime
- рассмотрите возможность перехода на
LocalDate
для промежуточных вычислений (см. пример)
- используйте явные ссылки на часовой пояс и замените
DateTimeZone
на ZoneId
person
Meno Hochschild
schedule
18.05.2015
LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
, что немного затянуто, но должно достичь того же результата: P - person MadProgrammer   schedule 18.05.2015