tl; dr
- Используйте современные java.time классы.
- Никогда не используйте
Date
/ Calendar
/ SimpleDateFormat
классов.
Пример:
ZonedDateTime // Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Always specify time zone using proper `Continent/Region` format. Never use 3-4 letter pseudo-zones such as EST, PDT, IST, etc.
)
.truncatedTo( // Lop off finer part of this value.
ChronoUnit.MILLIS // Specify level of truncation via `ChronoUnit` enum object.
) // Returns another separate `ZonedDateTime` object, per immutable objects pattern, rather than alter (“mutate”) the original.
.format( // Generate a `String` object with text representing the value of our `ZonedDateTime` object.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // This standard ISO 8601 format is close to your desired output.
) // Returns a `String`.
.replace( "T" , " " ) // Replace `T` in middle with a SPACE.
java.time
Современный подход использует java.time классы, которые годы назад вытеснили ужасные старые классы даты и времени, такие как Calendar
& SimpleDateFormat
.
хотят текущие дату и время
Записать текущий момент в UTC, используя Instant
.
Instant instant = Instant.now() ;
Чтобы увидеть тот же момент через объектив настенного времени, используемого людьми определенного региона (часового пояса), примените ZoneId
, чтобы получитьa ZonedDateTime
.
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 3-4-буквенное сокращение, например EST
или IST
, поскольку они не истинных часовых поясов, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Или, как ярлык, передать ZoneId
методу ZonedDateTime.now
.
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "Pacific/Auckland" ) ) ;
Классы java.time используют разрешение наносекунд .Это означает до девяти цифр десятичной доли секунды.Если вы хотите только три, миллисекунды, усечь .Передайте желаемый предел в виде объекта перечисления ChronoUnit
.
ZonedDateTime
.now(
ZoneId.of( "Pacific/Auckland" )
)
.truncatedTo(
ChronoUnit.MILLIS
)
в формате «дд / мм / гггг ЧЧ: мм: сс.СС»
Я рекомендую всегда включать смещение от UTC или часовой пояс при генерации строки, чтобы избежать двусмысленности и недопонимания.
Но если вы настаиваете, вы можете указать конкретный формат при генерации строки для представления значения даты и времени.Встроенный предопределенный форматер почти соответствует желаемому формату, но для T
, где вы хотите пробел.
String output =
zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )
;
sdf1.applyPattern ("дд / мм / гггг ЧЧ:mm: ss.SS ");
Date date = sdf1.parse (strDate);
Никогда не обменивайтесь значениями даты и времени, используя текст, предназначенный для представления людям.
Вместо этого используйте стандартные форматы, определенные для этой цели, которые можно найти в ISO 8601 .
java.time по умолчанию используют эти форматы ISO 8601, когдапарсинг / генерация строк.
Всегда включайте индикатор смещения от UTC или часового пояса при обмене конкретным моментом.Таким образом, желаемый формат, обсуждаемый выше, следует избегать для обмена данными.Кроме того, как правило, лучше всего обменять момент как UTC.Это означает Instant
в java.time .Вы можете обменять Instant
с ZonedDateTime
, эффективно настраивая часовой пояс на UTC для того же момента, той же точки на временной шкале, но другого настенного времени.
Instant instant = zdt.toInstant() ;
String exchangeThisString = instant.toString() ;
2018-01-23T01: 23: 45.123456789Z
В этом формате ISO 8601 используется символ Z
в конце для обозначения UTC, произносится «Zulu».
О 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 .