Joda-Time
Вот мой взгляд на эту проблему, используя Joda-Time 2.3.
Неизменный
Как правило, вы должны использовать неизменных версий классов Joda-Time.Почти все методы возвращают новый экземпляр DateTime
, а не изменяют существующий экземпляр.Упрощает вещи и обеспечивает автоматическую безопасность потоков.
Начало дня
Используйте более новый метод withTimeAtStartOfDay()
вместо установки времени дня на ноль.Из-за летнего времени (DST) и других аномалий в некоторые дни в некоторых часовых поясах нет полуночи или 00:00:00 часов дня.
Преобразование: juDate ↔ DateTime
Чтобы перевести экземпляр Joda-Time DateTime
в экземпляр java.util.Date , просто вызовите метод toDate
.Нет необходимости в конструкторе для Date.
Если вы используете java.util.Date и хотите использовать Joda-Time DateTime, просто передайте Date конструктору DateTime вместе с желаемым * 1033.*DateTimeZone
объект.
Пример кода
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
// Usually better to specify a time zone rather than rely on default.
DateTime now = new DateTime( timeZone ); // Or, for default time zone: new DateTime()
DateTime monthFromNow = now.plusMonths(1);
DateTime firstOfNextMonth = monthFromNow.dayOfMonth().withMinimumValue();
DateTime firstMomentOfFirstOfNextMonth = firstOfNextMonth.withTimeAtStartOfDay();
Или, если вы маньяк, объедините все это в одну строку кода.
DateTime allInOneLine = new DateTime( DateTimeZone.forID( "Europe/Paris" ) ).plusMonths( 1 ).dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
Перевести на старый java.util.Date для взаимодействия с другими классами / библиотеками.
java.util.Date date = firstMomentOfFirstOfNextMonth.toDate();
Дамп в консоль ...
System.out.println( "now: " + now );
System.out.println( "monthFromNow: " + monthFromNow );
System.out.println( "firstOfNextMonth: " + firstOfNextMonth );
System.out.println( "firstMomentOfFirstOfNextMonth: " + firstMomentOfFirstOfNextMonth );
System.out.println( "allInOneLine: " + allInOneLine );
System.out.println( "date: " + date );
При запуске ...
now: 2014-01-21T02:46:16.834+01:00
monthFromNow: 2014-02-21T02:46:16.834+01:00
firstOfNextMonth: 2014-02-01T02:46:16.834+01:00
firstMomentOfFirstOfNextMonth: 2014-02-01T00:00:00.000+01:00
allInOneLine: 2014-02-01T00:00:00.000+01:00
date: Fri Jan 31 15:00:00 PST 2014
java.time
Платформа java.time , встроенная в Java 8 и более поздние версии, заменяет старые классы java.util.Date/.Calendar.Вдохновленный Joda-Time и призванный стать его преемником.
Эти новые классы включают интерфейс TemporalAdjuster
( Tutorial ) с кучей реализаций в TemporalAdjusters
(обратите внимание на множественное число s
).Получается только тот регулятор, который нам нужен: firstDayOfNextMonth
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
LocalDate firstOfNextMonth = today.with ( TemporalAdjusters.firstDayOfNextMonth () );
Дамп на консоль.
System.out.println ( "today: " + today + " | firstOfNextMonth: " + firstOfNextMonth );
сегодня: 2015-12-22 |firstOfNextMonth: 2016-01-01
Если вы хотите использовать дату-время, а не только дату, настройте.
ZonedDateTime zdt = firstOfNextMonth.atStartOfDay( zoneId );
Если вам нужно использовать старый java.util.Дата для работы со старыми классами, которые еще не обновлены до java.time, конвертируйте из Instant
, извлеченного из объекта ZonedDateTime.Мгновенное действие - это момент времени на UTC.
java.util.Date date = java.util.Date.from( zdt.toInstant() );
О java.time
java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
- Java SE 8 , Java SE 9 , Java SE 10, а позже
- Встроенный.
- Часть стандартного Java API с встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упоминалось выше).См. Как использовать ThreeTenABP… .
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .