То, как время 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(…)
?
Так что просто генерация и анализ временной метки кажутся свернутыми и непоследовательными. Или я делаю это неправильно?
Вы можете передать '' Instant' в DateTimeFormatter.ISO_INSTANT.format (...) ', вы не можете? – lexicore
А, я могу! Мне не хватало весь метод 'DateTimeFormatter.format (...)'. Тем не менее, странно, что 'Instant' не имеет метода' format (...) ', если он работает с' DateTimeFormatter.format (...) '. И тогда другая проблема становится еще большей несогласованностью: я могу использовать 'DateTimeFormatter.ISO_INSTANCE' для форматирования' Instance', но не для его анализа! –