Разбор даты. Как разобрать этот формат даты?

Как разобрать этот формат даты:

"/Дата(1514728800000+0300)/"

Я не знаю, что означает это число или знак +.


person Ibrahim Disouki    schedule 18.10.2017    source источник
comment
где вы берете эти значения?   -  person Nouman Ch    schedule 18.10.2017
comment
Из веб-службы, к которой у меня нет доступа и которую я не могу изменить   -  person Ibrahim Disouki    schedule 18.10.2017
comment
понятия не имею о +0300 может быть часовой пояс или что-то в этом роде.   -  person Nouman Ch    schedule 18.10.2017
comment
Первая часть (1514728800000) представляет собой отметку времени unix — количество миллисекунд с начала эпохи unix (1970-01-01T00:00Z). Вторая часть (+0300) — это смещение UTC, представляющее собой отличие от UTC (в этом случае, на 3 часа вперед UTC). Но что должно получиться в результате разбора? java.util.Date? Любой другой объект?   -  person    schedule 18.10.2017
comment
@Hugo Мне кажется странным, что можно добавить смещение UTC к отметке времени Unix. Я думал, что одной из целей временных меток Unix было избежать проблем с часовыми поясами. (Не говорю, что вы ошибаетесь, на самом деле вы, вероятно, правы. Это просто кажется странным решением рассматриваемой веб-службы).   -  person S.L. Barth    schedule 18.10.2017
comment
@ S.L.Barth Я также думаю, что это странно, но я предполагаю, что вы можете преобразовать отметку времени в указанное смещение, чтобы получить конкретную дату и время (поскольку одна и та же отметка времени соответствует разным дате и времени в каждом часовом поясе) . Но я все же думаю, что это не самый умный формат...   -  person    schedule 18.10.2017


Ответы (3)


Частичный ответ: число — это эпоха.

Это количество секунд с 1 января 1970 года по всемирному координированному времени.
Это значение можно передать в конструктор java.util.Date, что даст вам объект Date с правильным значением.

+0300 неясно, возможно, это ссылка на другой часовой пояс.

person S.L. Barth    schedule 18.10.2017

Я не уверен насчет +0300, но вы можете преобразовать время эпохи в дату с помощью следующей функции:

 Date date = new Date(Long.parseLong(myDateToParse.replaceAll("[^\\d-]", "")));
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.DEFAULT);
person Andreas Imsand    schedule 18.10.2017
comment
Это создаст значение long, равное 15147288000000300, но последние цифры (0300) не являются частью значения миллис, и его не следует передавать конструктору Date (ваш код создает дату в году 481968). !) - вы должны пройти только 1514728800000. А Locale.DEFAULT не существует, возможно, вы имели в виду Locale.getDefault()? - person ; 18.10.2017
comment
@Hugo Правда, я имел в виду Locale.getDefault(), спасибо за вклад. Что касается +0300, я также должен сказать, что вы правы. Что я пытался сделать в своем примере, так это проанализировать простое время эпохи (без +0300). Вы можете просто удалить +0300 и добавить 3 часа (с необходимой логикой) к новой дате. - person Andreas Imsand; 18.10.2017
comment
Ну, вы всегда можете редактировать свои ответы, чтобы исправить/улучшить их, если хотите. - person ; 18.10.2017

Вот код, который анализирует это, предполагая, что у вас есть unixtimestamp_zoneoffset

String inputStr = "1514728800000+0300";
String[] splitStr = inputStr.split("[+-]");
String offsetSign = inputStr.indexOf("+")>0 ? "+" : "-";
ZonedDateTime captureTime = Instant.ofEpochMilli(Long.valueOf(splitStr[0])).atZone(ZoneOffset.of(offsetSign+splitStr[1]));

Возвращаемое значение: 2017-12-31T17:00+03:00.

person Radu Ionescu    schedule 18.10.2017