tl; dr
Используйте современные java.time классы.
Вот краткий бессмысленный пример начала с Instant
(момент в UTC)назначение часового пояса для просмотра этого момента через часы настенного времени, используемые людьми определенного региона (часового пояса), извлечение года и месяца в том виде, в каком оно воспринимается в этом часовом поясе, и определение первого и последнего днятого месяца, рендеринг LocalDate
объектов.
YearMonth // Represent a year-and-month, the entire month as a whole.
.from( // Determine the year-and-month of some other date-time object.
Instant // Represent a moment in UTC.
.now() // Capture the current moment in UTC.
.atZone( // Adjust from UTC to a particular time zone.
ZoneId.of( "Pacific/Auckland" )
) // Returns a `ZonedDateTime` object.
) // Returns a `YearMonth` object.
.atDay( 1 ) // Returns a `LocalDate` object.
… или
…
.atEndOfMonth() // Returns a `LocalDate` object.
Кстати, реалистичная версия этого конкретного кода будет: YearMonth.now( ZoneId.of( "Pacific/Auckland" ) ).atDay( 1 )
Момент против даты *
Instant
- это момент в UTC , дата с указанием времени дня и смещение .с-UTC ноль.
A LocalDate
- это значение только для даты, без времени суток и без часовой пояс .
Необходимо указатьчасовой пояс, по которому вы хотите воспринимать дату, настенные часы, используемые людьми определенного региона.
Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .
Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться.Лучше указать в качестве аргумента ваш желаемый / ожидаемый часовой пояс .
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 3-4-буквенное сокращение, например EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Извлечение только даты.
LocalDate ld = zdt.toLocalDate() ;
Оттуда перейдите к другому коду.
Или работайте с месяцем в целом, используя YearMonth
класс.
YearMonth ym = YearMonth.from( zdt ) ;
LocalDate first = ym.atDay( 1 ) ;
LocalDate last = ym.atEndOfMonth() ;
Совет: LocalDateRange
* может оказаться полезным.Классы 1080 * и Interval
в библиотеке ThreeTen-Extra .
Подсказка: узнайте о подходе Half-Open, чтобы определить промежуток времени, где начало включительно , а окончание эксклюзив .Таким образом, месяц начинается с первого и продолжается, но не включает первый день месяца , следующего за .
О java.time
Среда java.time встроена в 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?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .