Функция ZonedDateTime теперь обязательно содержит второе значение

Мой код требует текущего времени UTC в формате String.

String date = ZonedDateTime.now(ZoneOffset.UTC).withNano(0).toString();

Это работает нормально в большинстве случаев, за исключением случаев, когда время имеет нулевое значение секунды.

Normal output: 2018-03-07T11:33:09Z
Problem output: 2018-03-06T11:33Z

Пропускает печать во второй раз. Как я могу заставить печать секунд, даже если они равны нулю?

2 ответа

Решение

Вы можете использовать средство форматирования, чтобы всегда печатать часть секунды:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX");
String s = ZonedDateTime.now(ZoneOffset.UTC).withNano(0).format(dtf);
System.out.println(s); // 2018-03-20T16:15:07Z

Если вы используете DateTimeFormatter как и предложенный Meno, вам даже не нужно устанавливать значение nanos на ноль:

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX");
String formatted = ZonedDateTime.now(ZoneOffset.UTC).format(fmt);
System.out.println(formatted); // 2018-03-08T13:33:52Z

Это потому, что средство форматирования печатает только поля, указанные в формате. В этом случае он использует HH:mm:ss, что означает "часы: минуты: секунды". Поскольку доли секунд не в шаблоне, они не печатаются, поэтому нет необходимости вызывать withNano,

Это может звучать как незначительная деталь, но так как все эти классы неизменны, такие методы, как withNano всегда создайте новый объект, и в этом случае вам это не нужно, поэтому использование средства форматирования не только дает желаемый результат, но и позволяет избежать создания ненужных объектов (только с одним ZonedDateTime, это может показаться неуместным, но в сценарии с большим количеством форматируемых дат это может иметь какое-то значение, IMO).

Я бы позвонил withNano(0) только если я действительно хочу установить это поле на ноль. Если я просто не хочу печатать это при форматировании, я бы не назвал это.

Другие вопросы по тегам