Я пишу стандартную программу, которая (пока что) получает данные от Markit on Demand с помощью такого запроса:
http://dev.markitondemand.com/Api/v2/Quote/xml?symbol=aapl
Это возвращает данные в формате xml с различными показателями запаса (символ, имя, последняя цена, изменение, отметка времени и т. д.).
У меня возникли проблемы с созданием DateTimeFormatter в Java 8 для создания отметки времени.
Один пример метки времени:
Fri Jul 18 15:59:00 UTC-04:00 2014
Пока схема у меня такая:
EEE MMM d HH:mm:ss OOOO yyyy
Как я уверен, некоторые из вас заметили, у меня проблемы со смещением.
Из документации:
Смещение X и x: форматирует смещение на основе количества букв шаблона. Одна буква выводит только час, например «+01», если только минуты не равны нулю, в этом случае также выводятся минуты, например «+0130». Две буквы выводят часы и минуты без двоеточия, например «+0130». Три буквы выводят часы и минуты с двоеточием, например «+01:30». Четыре буквы выводят часы, минуты и необязательные секунды без двоеточия, например «+013015». Пять букв выводят часы и минуты и необязательную секунду с двоеточием, например «+01:30:15». Шесть или более букв вызывают исключение IllegalArgumentException. Буква шаблона «X» (верхний регистр) будет выводить «Z», когда смещение, которое должно быть выведено, равно нулю, тогда как буква шаблона «x» (нижний регистр) выводит «+00», «+0000» или «+00». :00'.
Смещение O: форматирует локализованное смещение на основе количества букв шаблона. Одна буква выводит краткую форму локализованного смещения, которая представляет собой текст локализованного смещения, например «GMT», с часами без ведущего нуля, необязательными 2-значными минутами и секундами, если они не равны нулю, и двоеточием, например «GMT+8». '. Четыре буквы выводят полную форму, которая является локализованным смещенным текстом, например «GMT, с 2-значным полем часов и минут, необязательным вторым полем, если оно не равно нулю, и двоеточием, например, «GMT+08:00». Любое другое количество букв вызывает исключение IllegalArgumentException.
Смещение Z: форматирует смещение на основе количества букв шаблона. Одна, две или три буквы выводят часы и минуты без двоеточия, например «+0130». Выход будет «+0000», когда смещение равно нулю. Четыре буквы выводят полную форму локализованного смещения, эквивалентную четырем буквам Offset-O. На выходе будет соответствующий локализованный текст смещения, если смещение равно нулю. Пять букв выводят часы, минуты, с необязательными секундами, если они не равны нулю, с двоеточием. Он выводит 'Z', если смещение равно нулю. Шесть или более букв вызывают исключение IllegalArgumentException.
// String rawDate = Fri Jul 18 15:59:00 UTC-04:00 2014
DateTimeFormatter PARSER_PATTERN = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss 'UTC'XXX yyyy");
ZonedDateTime timeStamp = ZonedDateTime.parse(rawDate, PARSER_PATTERN);
Это работает, но мне любопытно, почему (вместо UTC'XXX) OOOO
не работает.
StringIndexOutOfBoundsException
при попытке проанализировать строку, где смещение указано какGMT+02:00
в конце строки. В Java 9 тот же синтаксический анализ работает гладко, поэтому я подозреваю, что в Java 8 есть ошибка. - person Ole V.V.   schedule 26.07.2017GMT-04:00
, но я все еще не могу заставить его работать сUTC-04:00
. Не знаю почему. - person Ole V.V.   schedule 26.07.2017