java.time
String rsTime = "2018-04-09T10:47:16.999-02:00";
OffsetDateTime responseTime = OffsetDateTime.parse(rsTime);
System.out.println("Parsed date and time: " + responseTime);
Выходные данные этого фрагмента:
Дата и время анализа: 2018-04-09T10: 47: 16.999-02: 00
Работает так же хорошо для версии с пропущенными тысячами миллисекунд:
String rsTime = "2018-04-09T10:47:16-02:00";
Дата и время анализа: 2018-04-09T10: 47: 16-02:00
Используемые вами классы SimpleDateFormat
и Date
плохо разработаны и давно устарели (первые особенно печально известны).Так что не только в этом конкретном случае я рекомендую использовать вместо этого java.time, современный Java-интерфейс даты и времени.Однако строки с вашего сервера имеют формат ISO 8601, и OffsetDateTime
и другие классы java.time анализируют этот формат как формат по умолчанию, то есть без какого-либо явного средства форматирования, что уже значительно облегчает задачу.Кроме того, в стандарте дробные секунды являются необязательными, поэтому оба варианта строки анализируются без каких-либо проблем.OffsetDateTime
также печатает ISO 8601 обратно из его метода toString
, поэтому в обоих случаях печатается строка, идентичная проанализированной.
Только в том случае, если вам необходим старомодный Date
Объект для устаревшего API, который вы не можете изменить прямо сейчас, конвертируйте так:
Instant responseInstant = responseTime.toInstant();
Date oldfashionedDateObject = Date.from(responseInstant);
System.out.println("Converted to old-fashioned Date: " + oldfashionedDateObject);
Вывод на моем компьютере в часовом поясе Европы / Копенгагена:
Преобразован в старыйFashioned Дата: Пн Апр 09 14:47:16 CEST 2018
Ссылка: Обучающая программа Oracle: Дата Время , объясняющая, как использовать java.time.