java .time
Я новичок в классе дат Java.
Стоп! Резервное копирование, перемотка.
Оба java.util.Date
и java.sql.Date
классы ужасны , глубоко порочны и довольно разочаровывают. Никогда не используйте эти классы.
Эти классы были поставлены в самых ранних версиях Java. Смененные годы go современными java .time классами, определенными в JSR 310 .
Date date = new Date();
Чтобы зафиксировать текущий момент в UT C, используйте Instant.now
. Использует разрешение, меньшее, чем миллисекунды, используемые в классе java.util.Date
, который он заменил.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
task.setEndDate(dateFormat.format(date));
Ваш класс Task
должен удерживайте объект java .time вместо простой строки.
class Task {
Instant start , stop ;
…
}
Используйте умные объекты, а не тупые строки в вашей кодовой базе Java. Это обеспечивает допустимые значения , обеспечивает безопасность типов и делает ваш код более самодокументирующимся .
Если ваш Task
например, при бронировании встреч в будущем, когда вам нужно определенное время суток, независимо от изменений смещения, используемых вашим часовым поясом, затем используйте LocalDateTime
. Этот тип представляет только дату и время суток, но не имеет понятия о часовом поясе или смещении.
LocalDate ld = LocalDate.of( 2020 , Month.APRIL , 15 ) ;
Localtime lt = LocalTime.of( 15 , 30 ) ;
LocalDateTime ldt = LocalDateTime.of( ld , lt ) ;
При создании календаря, в котором вам нужна указанная точка c на временной шкале, затем примените соответствующий часовой пояс.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
На карту поставлен вопрос о том, что политики во всем мире проявляют склонность к изменению смещения, используемого часовым поясом (ами) своей юрисдикции. Политики делают это с удивительной частотой. И они сделали это практически без предупреждения.
При текстовом обмене значениями даты и времени с другими системами используйте форматы ISO 8601 . Эти форматы используются по умолчанию в java .time при разборе / генерации текста. А для представления пользователям создайте автоматически локализованные строки, используя DateTimeFormatter
.
new SimpleDateFormat ("гггг-мм-дд чч: мм: сс")
Этот формат неверен, если вы пытаетесь записать моменты, указав c точек на временной шкале. Вы должны включить индикацию часовой пояс и / или смещение от UT C для отслеживания момента.
Для моментов используйте форматы ISO 8601 упомянутый выше. Используется по умолчанию, поэтому нет необходимости указывать шаблон форматирования.
String input = "2020-01-23T01:23:45.123456789Z" ;
Instant instant = Instant.parse( input ) ;
Настройте с UT C на время в настенных часах, используемое людьми определенного региона (часового пояса).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Создание локализованного текста.
Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale ) ;
String output = zdt.format( f ) ;
См. Этот код, запущенный в режиме реального времени на IdeOne.com .
zdt.toString (): 2020-01-22T20: 23: 45.123456789-05: 00 [Америка / Монреаль]
выход: mercredi 22 января 2020 à 20 ч 23 мин 45 с heure normale de l'Est
long diff = date.getTime() - startDate.getTime() - 43200000;
Нет необходимости делать математику самостоятельно. У нас есть класс для этого: Duration
.
Duration d = Duration.between( start , stop ) ;
Если вам нужен отсчет целых секунд за весь промежуток времени, позвоните по номеру Duration::toSeconds
.
long seconds = d.toSeconds() ; // Entire duration in terms of whole seconds.
О java .time
Рамка java .time встроенный в Java 8 и позже. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Чтобы узнать больше, см. Учебник Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация: JSR 310 .
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java .time классов.
Вы можете обмениваться java .time объектами непосредственно с вашей базой данных. Используйте драйвер JDB C , совместимый с JDB C 4. 2 или позже. Нет необходимости в строках, нет необходимости в java.sql.*
классах. Поддержка Hibernate 5 и JPA 2.2 java .time .
Где взять java .time классы?
ThreeTen-Extra Проект расширяет java .time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java .time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .