2017-01-12 6 views
3

Я запрашивая JSON API, который возвращает что-то вроде этого:Определить TimeZone из строки JSON?

{ 
    "created_time": "2017-01-05T16:32:29+0100", 
    "updated_time": "2017-01-11T09:38:41+0100", 
    "id": "23842536731240607" 
} 

Мне нужно хранить время в формате UTC, но для того, чтобы изменить часовой пояс, я сначала нужно разобрать его как ZonedDateTime.

Для преобразования "+0100" в "+01:00" достаточно просто. Но как я могу разобрать (созданный/обновленный) _time в ZonedDateTime, чтобы преобразовать его в UTC?

+1

возможно дубликат [Java Time Zone При разборе DateFormat] (http://stackoverflow.com/questions/4542679/java- time-zone-when-parsing-dateformat) –

+1

Возможный дубликат http://stackoverflow.com/questions/34115801/how-to-convert-any-date-time-to-utc-using-zoneddatetime-or-java-8 ? rq = 1 – nikli

+1

Сохраните ваши даты в виде длинных значений, представляющих число миллисекунд в UTC. Таким образом, вы можете легко отображать их, но вы хотите позже. При хранении дат UTC и часовой пояс не имеют значения. Для отображения это другой вопрос. –

ответ

0

Хорошо, позвольте мне разобрать заявление о проблеме.

Прежде всего, если вы запрашиваете API, тогда можно предположить, что они следуют стандартным форматам даты и времени (даже если вы их создаете). Глядя на данную дату, похоже, они следуют - ** ISO 8601 - дата и формат времени **

Таким образом, проблема в том, как разобрать ISO 8601 - формат даты и времени

Каковы лучшие варианты ?

  • Использование Joda Time.
  • Использования Date Time API Java-8

    //Joda 
    String jtDate = "2010-01-01T12:00:00+01:00"; 
    DateTimeFormatter yoda = ISODateTimeFormat.dateTimeNoMillis(); 
    System.out.println(parser2.parseDateTime(jtDate)); 
    
    //using Java 8 (As you specified - To convert "+0100" to "+01:00" is easy enough.) 
    String strDate = "2017-01-05T16:32:29+01:00"; 
    DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_DATE_TIME; 
    TemporalAccessor convertMe = timeFormatter.parse(strDate); 
    Date date = Date.from(Instant.from(convertMe)); 
    System.out.println(date); 
    

Надеется, что это помогает :)

+0

LocalDateTime - это неправильный класс для использования здесь. Вы потеряете информацию о смещении с UTC. Кроме того, Вопрос запрашивает результат в UTC. –

+0

Также я попробовал вам код Java 8 и получил 'java.time.format.DateTimeParseException: Text '2017-01-05T16: 32: 29 + 0100' не удалось разобрать, текст нераспакованного в индексе 19' (индекс 19 - это знак '+'). –

+0

Лучше, но теперь ваши строки ввода не относятся к Вопросу. Входы Вопроса не имеют двоеточия в смещении. –

3

Есть несколько вариантов.

Во-первых, как вы говорите, вставка двоеточия в смещение зоны не так уж трудна. После того как вы сделали это, получая ZonedDateTime просто:

ZonedDateTime zdt = ZonedDateTime.parse("2017-01-11T09:38:41+01:00"); 
    System.out.println(zdt); 

Печатается:

2017-01-11T09:38:41+01:00 

В качестве альтернативы, странно, в то время как ZonedDateTime.parse(String) нужно двоеточия смещения, ZoneId.of() не делает, так что вы можете отделить смещение и выполнить:

ZoneId zi = ZoneId.of("+0100"); 
    LocalDateTime ldt = LocalDateTime.parse("2017-01-11T09:38:41"); 
    ZonedDateTime zdt = ldt.atZone(zi); 

Результат такой же, как и раньше.

Если вы не хотите модифицировать строку до разбора его, есть также:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); 
    ZonedDateTime zdt = ZonedDateTime.parse("2017-01-11T09:38:41+0100", dtf); 

Кроме того, это дает тот же результат.

Редактировать: Note: Я использую ZonedDateTime, так как вы просили об этом в своем вопросе. Вы можете более правильно использовать OffsetDateTime. Большая часть кода практически такая же. Версия, которая отщепляет смещение будет идти, как это:

ZoneOffset zo = ZoneOffset.of("+0100"); 
    LocalDateTime ldt = LocalDateTime.parse("2017-01-11T09:38:41"); 
    OffsetDateTime odt = ldt.atOffset(zo); 

Чтобы преобразовать в UTC, как уже упоминалось в конце вопрос, применить другой ZoneOffset, постоянная ZoneOffset.UTC.

OffsetDateTime odtUtc = odt.withOffsetSameInstant(ZoneOffset.UTC); 

 Смежные вопросы

  • Нет связанных вопросов^_^