2016-12-13 1 views
0

То, как время Java обрабатывает простые вещи, такие как временные метки, оставляет меня немного ошеломленным. Возможно, я делаю это неправильно.Неотложные расхождения во времени Java

Я хочу создать строку timestamp ISO 8601. Очевидным способом было бы создать Instance.now() и отформатировать его DateTimeFormatter.ISO_INSTANT для его форматирования. За исключением того, что Instance не имеет метода format(), поэтому я не могу отформатировать его с помощью форматирования «экземпляр». Представь это.

Поэтому я должен создать ZonedDateTime из экземпляра. Не имеет значения, какую зону выбрать, поэтому я выбираю UTC, потому что это то, что DateTimeFormatter.ISO_INSTANT собирается поставить его в любом случае:

Instant.now().atZone(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT) 

Теперь я получаю обратно строку, и, очевидно, я хочу, чтобы получить его обратно к ZonedDateTime экземпляр, потому что это то, что я использовал для его форматирования! Поэтому я стараюсь:

ZonedDateTime.parse(timestamp, DateTimeFormatter.ISO_INSTANT) 

Он жалуется на то, что информации о часовом поясе нет. Но я использовал ZonedDateTime, чтобы сгенерировать его. Это не моя вина, что он не позволит мне использовать Instance для его форматирования.

Как ни странно Instance не имеет метод format(), но у него есть parse() метод, который, опять-таки странно, анализируется с помощью DateTimeFormatter.ISO_INSTANT (хотя я не могу форматInstance с использованием этого форматера).

Как указано в комментариях, я могу использовать DateTimeFormatter.ISO_INSTANT.format(Instance.now()) для форматирования экземпляра напрямую, так почему же нет Instance.format(…)?

Так что просто генерация и анализ временной метки кажутся свернутыми и непоследовательными. Или я делаю это неправильно?

+1

Вы можете передать '' Instant' в DateTimeFormatter.ISO_INSTANT.format (...) ', вы не можете? – lexicore

+0

А, я могу! Мне не хватало весь метод 'DateTimeFormatter.format (...)'. Тем не менее, странно, что 'Instant' не имеет метода' format (...) ', если он работает с' DateTimeFormatter.format (...) '. И тогда другая проблема становится еще большей несогласованностью: я могу использовать 'DateTimeFormatter.ISO_INSTANCE' для форматирования' Instance', но не для его анализа! –

ответ

-1

Зачем вам нужно обработать форматирование при анализе строки? Разве вы не можете сделать ZonedDateTime.parse(timestamp);?

2

Во-первых, вы можете просто DateTimeFormatter.ISO_INSTANT.format(Instant.now()).

Далее я не понимаю, почему вы ожидаете отменить то, что вы отформатировали. Форматирование не гарантируется как операция без потерь. Если вы отформатируете LocalDateTime всего год, вы не ожидаете, что его разберете до LocalDateTime, не так ли?

И, конечно, вы можете разобрать Instant, используя DateTimeFormatter.ISO_INSTANT. DateTimeFormatter.ISO_INSTANT.parse(text, Instant::from) - это то, что Instant.parse(...).

+0

«Форматирование не гарантируется как операция без потерь». Я согласен в качестве общего утверждения, и я не хочу быть аргументированным, но что именно я «потерял», когда отформатировал формат «Instant» в формате ISO 8601? Разве у меня нет 100% информации, необходимой для возвращения оригинального «Мгновенного»? (Я могу доказать это вам через какой-то код --- какой-то запутанный код, это моя точка.) –

+0

Спасибо, что напомнили мне, что я могу передать эти объекты времени 'DateTimeFormatter.format (...)', чтобы удалить часть несоответствие. Но многие другие, о которых я упоминаю, по-прежнему остаются. –

+0

@GarretWilson Подождите секунду, вы не отформатировали 'Instant', вы отформатировали' ZonedDateTime' и попытались разобрать его с помощью 'ZonedDateTime'. И не только это, но вы также использовали 'DateTimeFormatter.ISO_INSTANT' для синтаксического анализа (здесь вы теряете часовой пояс). Поэтому я не понимаю, как вы можете спорить о «возврате оригинального« Instant », так как это явно не то, что вы делаете в коде. – lexicore

1

Нет необходимости в методе format(DateTimeFormatter) в Instant, потому что toString() выполняет эту работу. Метод InstanttoString() реализован как:

return DateTimeFormatter.ISO_INSTANT.format(this); 

Таким образом, все, что вам нужно сделать, это вызов instant.toString().

Для редиректа разобрать этот обратно, просто использовать parse():

Instant instant = Instant.parse(text); 

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

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