Избегайте устаревших классов даты и времени
Вы используете ужасные старые классы даты и времени, которые были вытеснены годами назад современными java.time классами.
ZonedDateTime
В частности, класс GregorianCalendar
заменяется на ZonedDateTime
. Этот класс представляет момент, точку на временной шкале как дату, время дня и часовой пояс.
Но ZonedDateTime
не подходит для планирования будущих встреч. Вместо этого мы должны отделить дату и время от часового пояса при бронировании будущих встреч. Более подробное объяснение ниже.
LocalDate
Преобразуйте ваши строковые значения для года, месяца и дня в числа.
int y = Integer.parseInt( year ) ;
int m = Integer.parseInt( month ) ;
int d = Integer.parseInt( day ) ;
Создание экземпляра LocalDate
. Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса или смещения от UTC .
LocalDate ld = LocalDate.of( y , m , d ) ;
LocalDateTime
Ваш Booking
класс должен иметь LocalDateTime
переменную-член. В этом классе намеренно отсутствует понятие часовой пояс или смещение от UTC . Мы используем это для будущих назначений, потому что политики по всему миру часто меняют смещение своего часового пояса. Часто они делают это практически без предупреждения. Для назначений, таких как «3 часа дня 23 января», мы обычно подразумеваем 3 часа дня на часах на стене для часового пояса, действующего в настоящее время на эту дату, а не как сегодня. Например, если правительство переводит часы на полчаса, мы не хотим, чтобы наше назначение состоялось в 2:30, мы все еще хотим 3:00 - это другой момент, чем если бы политики оставили нетронутыми определения часовых поясов.
ZoneId
Нам также необходимо сохранить предполагаемый часовой пояс с назначением. Зона применяется к LocalDateTime
во время выполнения, когда нам нужен момент, конкретная точка на временной шкале.
Booking
класс
Итак, ваш Booking
класс выглядит примерно так.
public class Booking {
String clientName ;
LocalDateTime appointment ;
ZoneId zoneId ;
}
Для создания экземпляра:
LocalDateTime = LocalDateTime( 2019 , 1 , 23 , 15 , 0 , 0 , 0 ) ; // 3 PM on Jan 23, 2019.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Booking booking = new Booking( "Alice" , ldt , z ) ;
Соберите такие экземпляры.
List< Booking > bookings = new ArrayList<>() ;
bookings.add( booking ) ;
Сравнить с фильтром
Чтобы отфильтровать эти заказы по определенной дате, зациклите собранные объекты Booking
, извлеките LocalDateTime
из каждого, извлеките значение только для даты (a LocalDate
) и сравните с целевой датой.
LocalDate target = LocalDate.of( 2019 , Month.FEBRUARY , 1 ) ; // First of February.
List< Booking > filteredBookings = new ArrayList<>() ;
for( Booking booking : bookings ) {
if( booking.appointment.toLocalDate().isEqual( target ) ) {
filteredBookings.add( booking ) ; // Collect this `Booking` object whose date matches our target date.
}
}
ZonedDateTime
вновь
Когда вам нужен определенный момент, например, создание системы календаря или при записи истории, примените часовой пояс (ZoneId
) к дате-времени (LocalDateTime
), чтобы получить момент (ZonedDateTime
).
ZonedDateTime zdt = booking.appointment.atZone( booking.zone ) ;
Чтобы увидеть этот момент в UTC, ту же точку на временной шкале, но другое время на настенных часах, извлеките объект Instant
.
Instant instant = zdt.toInstant() ; // Adjust from time zone to UTC.
Обычно лучше всего работать с UTC, а не с зонированным значением для ведения журнала, базы данных, хранения и обмена данными.
О 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 .