tl; др
LocalDateTime.parse( // Parse string as a `LocalDateTime`. Lacking any time zone or offset-from-UTC means this is *not* a moment, *not* a point on the timeline.
"2018-04-25 20:09:55".replace( " " , "T" ) // Alter input to comply with ISO 8601 standard format, used by default in the *java.time* classes.
) // Returns a `LocalDateTime` object.
.atZone( // Give context and meaning to our `LocalDateTime`, to determine a point on the timeline.
ZoneId.of( "America/Montreal" ) // Always specify time zone using proper `Continent/Region` format, never 3-4 letter pseudo-zones such as `PST`, `CST`, `IST`.
) // Returns a `ZonedDateTime` object.
.toInstant() // 2018-04-26T00:09:55Z. Extract a UTC value, `Instant` object, from the `ZonedDateTime`.
.toEpochMilli() // Ask for count of milliseconds from 1970-01-01T00:00Z to this moment.
1524701395000
java.time
Измените ввод строки в соответствии со стандартом ISO 8601.
String input = "2018-04-25 20:09:55".replace( " " , "T" ) ;
2018-04-25 20: 09: 55
Разбор.
LocalDateTime ldt = LocalDateTime.parse( input ) ;
ldt.toString (): 2018-04-25T20: 09: 55
Примените предполагаемый часовой пояс, используя ZoneId
, чтобы получитьZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
zdt.toString (): 2018-04-25T20: 09: 55-04: 00 [Америка / Монреаль]
Извлечениезначение в UTC, Instant
.
Instant instant = zdt.toInstant();
instant.toString (): 2018-04-26T00: 09: 55Z
Получить счетчикмиллисекунды с первого момента 1970 UTC, 1970-01-01T00: 00Z.
long millis = instant.toEpochMilli() ;
1524701395000
Если эта входная строка была предназначена для UTC, а не длячасовой пояс (ваш вопрос неясен в этом отношении), используйте те же идеи, что и выше, но переключитесь на OffsetDateTime
и ZoneOffset
вместо ZonedDateTime
и ZoneId
.
LocalDateTime.parse(
"2018-04-25 20:09:55".replace( " " , "T" )
)
.atOffset(
ZoneOffset.UTC // Using `ZoneOffset` rather than `ZoneId`. For UTC, we have the constant `ZoneOffset.UTC`.
) // Returns an `OffsetDateTime` object.
.toInstant() // 2018-04-25T20:09:55Z
.toEpochMilli()
Обратите внимание, что мы получаем результат, отличный от указанного выше, так как 20:00 в UTC - это другой момент, чем 20:00 в Монреале-Квебеке.
1524686995000
О java.time
java.time Framework встроен в 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?
- Java SE 8 , Java SE 9 , Java SE 10, а позже
- Встроенный.
- Часть стандартного Java API с встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Android
- Более поздние версии реализации комплекта Android-классов java.time.
- Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .