Как напечатать текущее время и дату в формате даты ISO в Java? - PullRequest
0 голосов
/ 30 апреля 2018

Я должен отправить текущую дату и время в формате ISO, как указано ниже:

'2018-02-09T13: 30: 00.000-05: 00'

Я написал следующий код:

Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000'Z'");
System.out.println(formatter.format(date));
System.out.println(formatter1.format(date));

Печатается следующим образом:

2018-04-30T12:02
2018-04-30T12:02:58.000Z

Но это не печать в формате, указанном выше. Как я могу получить -5: 00, как показано в формате, и что это означает?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Простое решение:

    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 и не знали бы часовой пояс или смещение, это было бы очень неоднозначно. Смещение идеально подходит для превращения времени в однозначный момент времени.

Ссылки

0 голосов
/ 30 апреля 2018

В Java 8 вы можете использовать новый java.time API:

OffsetDateTime now = OffsetDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
System.out.println(formatter.format(now)); // e.g. 2018-04-30T08:43:41.4746758+02:00

Выше используется стандартный форматер времени данных ISO. Вы также можете усечь до миллисекунд с помощью:

OffsetDateTime now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS);

Что дает что-то вроде (только 3 цифры после точки):

2018-04-30T08:54:54.238+02:00
...