Простое решение:
System.out.println(OffsetDateTime.now(ZoneId.of("America/Panama")).toString());
Только сейчас я получил этот вывод:
2018-04-30T02: 12: 46.442185-05: 00
Чтобы контролировать, что секунды всегда печатаются точно с тремя десятичными знаками:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX");
OffsetDateTime now = OffsetDateTime.now(ZoneId.of("America/Panama"));
System.out.println(now.format(formatter));
2018-04-30T02: 12: 46.442-05: 00
Во-первых, в простой версии будет напечатано достаточное количество групп по три знака после запятой, чтобы отобразить полную точность. Кроме того, секунды будут полностью пропущены, если они окажутся равными 0.0. Оба, вероятно, в порядке, потому что все это разрешено в том формате ISO 8601, который вы просили. Поэтому тот, кто получает эту строку, должен быть счастлив в любом случае.
Пожалуйста, укажите желаемый часовой пояс, в котором я использовал Америку / Панаму. Лучше всего указать явный часовой пояс для предсказуемого вывода.
Я использую и рекомендую java.time
, современный Java-интерфейс даты и времени. SimpleDateFormat
, который вы использовали, не только давно устарел, но и печально известен своими хлопотами. java.time
намного приятнее работать.
Что означает -05: 00?
-05:00
- это смещение от UTC (или по Гринвичу, это почти то же самое). Итак, ваш пример строки, вероятно, из восточного часового пояса в Северной Америке или в каком-то другом месте в Центральной или Южной Америке (Куба, Боливия, чтобы упомянуть несколько, которые используют это смещение в течение некоторого года). Точнее -05:00
означает, что мы используем часы, которые на 5 часов (и 0 минут) отстают от UTC. Таким образом, 2: 12: 46-05: 00 обозначает тот же момент времени, что и 7:12:46 UTC. Если бы мы знали только время 2:12:46 и не знали бы часовой пояс или смещение, это было бы очень неоднозначно. Смещение идеально подходит для превращения времени в однозначный момент времени.
Ссылки