Т.Л., д-р
ZonedDateTime.of(
LocalDate.of(2015 , Month.JANUARY , 8) ,
LocalTime.of(7 , 13 , 0) ,
ZoneId.of("Africa/Tunis")
)
.toInstant()
.toEpochMilli()
java.time
Современный подход использует это java.time классы, которые вытесняют старые хлопотное наследство дата-время. Итак, намного проще и чище.
Ваш код неоднозначен, так как вы не решаете ключевую проблему часового пояса. Поскольку вы не указали часовой пояс явно, текущий часовой пояс вашего JVM будет применяться неявно. Я настоятельно рекомендую всегда с указанием желаемого/ожидаемого часового пояса.
Указать proper time zone name в формате continent/region
, такие как America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте псевдо-зоны 3-4 буквы, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированные, и даже не уникальные (!).
LocalDate ld = LocalDate.of(2015 , Month.JANUARY , 8) ;
LocalTime lt = LocalTime.of(7 , 13 , 0) ;
ZoneId z = ZoneId.of("Pacific/Auckland") ;
ZonedDateTime zdt = ZonedDateTime.of(ld , lt , z) ;
Вы также можете использовать комбинированный коэффициент.
ZonedDateTime zdt = ZonedDateTime.of(2015 , Month.JANUARY , 8 , 7 , 13 , 0 , 0 , ZoneId.of("Pacific/Auckland")) ;
Обычно я рекомендую не отслеживать дату-время, как отсчет времени. Но это, по-видимому, требование в вашем случае.
Сначала мы можем извлечь Instant
, моментом в UTC. Класс Instant
представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).
Instant instant = zdt.toInstant() ; // Convert from a zoned value to a UTC value.
Вы можете задать для подсчета миллисекунд, прошедших после обращения эпохи первого момента 1970 в UTC, 1970-01-01T00: 00: 00Z. Остерегайтесь возможной потери данных, так как любые микросекунды или наносекунды в Instant
будут игнорироваться при представлении отчетов за миллисекунды.
long millis = instant.toEpochMilli() ; // Count of milliseconds since 1970-01-01T00:00:00Z.
О java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.
Использование JDBC driver соответствует JDBC 4.2 или более поздней версии, вы можете обменять java.time объекты непосредственно с базой данных. Нет необходимости в строках или классах java.sql. *.
Где получить классы java.time?
- Java SE 8, Java SE 9, а затем
- Встроенный.
- Часть стандартного Java API с объединенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android реализаций пачке классов java.time.
- Для более ранних Android, проект ThreeTenABP адаптируется ThreeTen-Backport (упомянутый выше). См. How to use ThreeTenABP….
ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
Что означает 'но это не работает'? – Jens