Для определения «дней» требуется часовой пояс.Часовой пояс определяет, когда начинается «день».Часовой пояс включает в себя правила для перехода на летнее время и другие аномалии.Там нет магии, чтобы сделать часовые пояса неактуальными.Если вы игнорируете проблему, будет применен часовой пояс JVM по умолчанию.Это приводит к путанице и боли.
Избегайте java.util.Date
Классы java.util.Date и .Calendar, как известно, доставляют много хлопот.Избежать их.Они настолько плохи, что Sun / Oracle согласились заменить их новым java.time пакетом в Java 8. Используйте либо это, либо Joda-Time .
Joda-Time
Пример кода в Joda-Time 2.3.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); // Specify or else the JVM's default will apply.
DateTime dateTime = new DateTime( new java.util.Date(), timeZone ); // Simulate passing a Date.
DateTime weekAgo = dateTime.minusDays( 7 );
Первый момент дня
Или, возможно, вы захотите настроить время суток напервый момент дня, чтобы захватить ценность целого дня.Вызовите метод withTimeAtStartOfDay
.Имейте в виду, что это обычно 00:00:00
, но не всегда.
Избегайте "полуночных" методов и классов в Joda-Time.Они основаны на неверной концепции и теперь устарели.
DateTime dateTimeStart = new DateTime( new java.util.Date(), timeZone ).withTimeAtStartOfDay(); // Not necessarily the time "00:00:00".
DateTime weekAgo = dateTime.minusDays( 7 ).withTimeAtStartOfDay();
Преобразовать в / из juDate
Как видно выше, для преобразования из java.util.Date в Joda-Time просто передатьобъект Date для конструктора DateTime.Поймите, что у juDate нет часового пояса , у DateTime есть.Поэтому назначьте желаемый / подходящий часовой пояс для определения того, что такое «дни» и когда они начнутся.
Чтобы пойти другим путем, от DateTime к juDate, просто вызовите метод toDate
.
java.util.Date date = dateTime.toDate();