tl; dr
Код:
LocalDateTime.parse(
"09.11.2019 01:30:17" ,
DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm:ss" )
)
.atOffset(
ZoneOffset.UTC
)
.toInstant()
.toEpochMilli()
См. Этот код, запущенный на IdeOne.com .
1573263017000
Подробности
Правильный ответ по Turing85 отвечает на ваш конкретный c вопрос о том, почему недопустимые отрицательные числа. Но у вас есть другие проблемы.
ISO 8601
Теперь мой формат импорта: 09.11.2019 01: 30: 17
Я предлагаю вам обучить издатель этих данных о стандарте ISO 8601 , определяющем форматы, используемые при передаче значений даты и времени в виде текста.
Устаревшие классы даты и времени
Вы используете ужасно классы даты и времени, которые были заменены годами go современными java .time классами, определенными в JSR 310. Никогда не используйте Date
или SimpleDateFormat
.
Момент
Очевидно, вы хотите получить количество миллисекунд с начала отсчета эпохи первого момента 1970 года в UT C. Но для этого требуется момент, указав c точку на временной шкале.
Ваш вклад не соответствует этому требованию. Ваш ввод - это дата и время дня, но в нем отсутствует контекст смещения от UT C или часового пояса.
Итак, возьмем ваш пример 09.11.2019 01:30:17
. Мы не можем знать, будет ли это 1:30 дня в Токио, Япония, или 13:30 в Париже, Франция, или 1:30 в Толедо, Огайо, США, - все это очень разные моменты, с разницей в несколько часов на временной шкале.
Таким образом, мы должны сначала проанализировать ваш ввод как LocalDateTime
. Этот класс представляет дату и время без какой-либо концепции смещения или зоны.
String input = "09.11.2019 01:30:17" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
Возможно, вы наверняка знаете смещение или зону, намеченные издателем этих данных. Если это так:
Возможно, вы наверняка знаете это вход был предназначен для UT C, то есть смещения нуля часов-минут-секунд.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
Чтобы получить счетчик миллисекунд с 1970-01-01T00: 00Z преобразовать в основание c класс строительного блока Instant
.
Instant instant = odt.toInstant() ;
Запросить количество миллисекунд с начала эпохи.
long millisSinceEpoch = instant.toEpochMilli() ;
Поймите, что ваш исходный код игнорировал решающий вопрос о часовом поясе и смещении от UT C. Таким образом, ваш код неявно применяет текущий часовой пояс JVM по умолчанию. Это означает, что ваши результаты будут отличаться во время выполнения, и означает, что вы, вероятно, также получите неправильные результаты.
О 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.*
классах.
Где получить java. время занятий?
ThreeTen-Extra Проект расширяет java .time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java .time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .