Преобразование даты iso8601 в метку времени unix в java

у меня есть строка даты

   String s = "2014-09-01T19:22:43.000Z";
  Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(s);

но я получаю исключение:

Exception in thread "main" java.text.ParseException: Unparseable date: "2014-09-01T19:22:43.000Z"

Как преобразовать вышеуказанную строку в метку времени unix? Спасибо

2 ответов


X используется ISO 8601 time zone на SimpleDateFormat, а не Z

правильный формат "yyyy-MM-dd'T'HH:mm:ss.SSSX"


tl; dr

как преобразовать вышеуказанную строку в метку времени unix?

Instant.parse( "2014-09-01T19:22:43.000Z" )
       .getEpochSecond()

java.время

на java.time.Instant класс может анализировать входную строку в стандартном формате ISO 8601. Нет необходимости указывать шаблон форматирования.

Instant instant = Instant.parse( "2014-09-01T19:22:43.000Z" );

чтобы получить количество миллисекунд с эпохи 1970 года:

long millisecondsSinceUnixEpoch = instant.toEpochMilli() ;

для целых секунд с эпохи 1970-01-01T00:00:00Z:

long secondsSinceUnixEpoch = instant.getEpochSecond() ;

будет в курсе возможна потеря данных при переходе на миллисекунды или целые секунды. Ява.классы времени имеют разрешение наносекунды, поэтому любые микросекунды или наносекунды, присутствующие в значении, будут усечены.

Joda Времени

обновление проект Joda-Time теперь находится в режиме обслуживания. Команда советует перейти на java.классы время.

библиотека Joda-Time упрощает эту работу. Ваш ISO 8601 уступчивый строка может быть подана непосредственно конструктору Joda-Time. Встроенный парсер ожидает ISO 8601.

DateTime dateTime = new DateTime( "2014-09-01T19:22:43.000Z" ) ;

Метка Времени Unix

что вы подразумеваете под меткой времени Unix? Некоторые люди имеют в виду количество целых секунд с первого момента 1970 UTC (Unix эпохи), игнорируя прыжковые секунды (см. Время Unix). Некоторые люди имеют в виду количество миллисекунд или иного решения.

Примечание использование long примитивные, а не более распространенные int.

за миллисекунды звоните getMillis().

long millisecondsSinceUnixEpoch = dateTime.getMillis();

в течение целых секунд делите на 1000. Рассмотрим, требуется ли округление или усечение дробных секунд.


обычно я бы предложил передать объект DateTimeZone вместе с вашей строкой конструктору DateTime. Но нет необходимости, если все, что вы хотите, это граф с эпохи.


о java.время

на java.время framework встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

на Joda Времени, теперь режим обслуживания, советует миграцию в java.время занятия.

чтобы узнать больше, см. В Oracle Учебник. И search Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.

где получить java.время занятий?

  • Java SE 8, Java SE 9, и позже
    • встроенный.
    • часть стандартного API Java с комплексная реализация.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • более поздние версии Android bundle реализации java.классы время.
    • для более раннего Android,ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). См.как использовать ThreeTenABP....

на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательной площадкой для возможных будущих дополнений к java.время. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.