tl; д-р
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate ld =
givenJavaUtilDate.toInstant()
.atZone( z )
.toLocalDate();
LocalDate today = LocalDate.now( z );
LocalDate kwanzaaStart = today.withMonth( Month.DECEMBER ).withDayOfMonth( 26 );
LocalDate kwanzaaStop = kwanzaaStart.plusWeeks( 1 );
Boolean isDateInKwanzaaThisYear = (
( ! today.isBefore( kwanzaaStart ) )
&&
today.isBefore( kwanzaaStop )
)
Напіввідкритий
Для роботи часу і часу зазвичай використовується підхід "напіввідкритий" для визначення періоду часу. Початок є інклюзивним, а кінець ексклюзивним . Отже, тиждень, що починається в понеділок, доходить до наступного понеділка, але не включає його.
java.time
Java 8 і пізніших версій поставляється із java.timeвбудованою структурою. Витісняє старі клопітні класи, включаючи java.util.Date/.Calendarі SimpleDateFormat. Натхненний успішною бібліотекою Joda-Time. Визначено JSR 310. Розширено проектом ThreeTen-Extra.
А Instant- це момент на часовій шкалі в UTC з наносекундною роздільною здатністю.
Instant
Перетворіть свої java.util.Dateоб’єкти на миттєві об’єкти.
Instant start = myJUDateStart.toInstant();
Instant stop = …
Якщо ви отримуєте java.sql.Timestampоб'єкти через JDBC з бази даних, перетворіть у java.time.Instant подібним чином. A java.sql.Timestampвже в UTC, тому не потрібно турбуватися про часові пояси.
Instant start = mySqlTimestamp.toInstant() ;
Instant stop = …
Отримайте поточний момент для порівняння.
Instant now = Instant.now();
Порівняйте, використовуючи методи isBefore, isAfter і дорівнює.
Boolean containsNow = ( ! now.isBefore( start ) ) && ( now.isBefore( stop ) ) ;
LocalDate
Можливо, ви хочете працювати лише з датою, а не з часом дня.
LocalDateКлас являє собою дату тільки значення, без часу доби і без часового поясу.
LocalDate start = LocalDate.of( 2016 , 1 , 1 ) ;
LocalDate stop = LocalDate.of( 2016 , 1 , 23 ) ;
Щоб отримати поточну дату, вкажіть часовий пояс. У будь-який момент сьогоднішня дата змінюється залежно від часового поясу. Наприклад, у Парижі світає новий день раніше, ніж у Монреалі.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
Ми можемо використовувати isEqual, isBeforeі isAfterметоди порівняння. У роботі з датою та часом ми зазвичай використовуємо підхід напіввідкритого типу, коли початок періоду часу є включним, а закінчення ексклюзивним .
Boolean containsToday = ( ! today.isBefore( start ) ) && ( today.isBefore( stop ) ) ;
Interval
Якщо ви вирішили додати до свого проекту бібліотеку ThreeTen-Extra , ви можете використовувати Intervalклас, щоб визначити проміжок часу. Цей клас пропонує методи перевірки, чи містить інтервал , стикається , закриває чи перекриває інші дати-часи / інтервали.
IntervalКлас працює на Instantоб'єктах. InstantКлас являє собою момент на часовій шкалі в форматі UTC з дозволом наносекунд (до дев'яти (9) цифр десяткового дробу).
Ми можемо налаштувати LocalDateпевний момент, перший момент дня, вказавши часовий пояс для отримання ZonedDateTime. Звідти ми можемо повернутися до UTC, витягнувши файл Instant.
ZoneId z = ZoneId.of( "America/Montreal" );
Interval interval =
Interval.of(
start.atStartOfDay( z ).toInstant() ,
stop.atStartOfDay( z ).toInstant() );
Instant now = Instant.now();
Boolean containsNow = interval.contains( now );
Про java.time
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.
Проект Joda-Time , який зараз перебуває в режимі технічного обслуговування , радить перейти на java.timeкласи.
Щоб дізнатись більше, див. Підручник Oracle . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .
Де взяти java.timeкласи?
Проект ThreeTen-Extra поширюється java.timeна додаткові класи. Цей проект є полігоном для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .