Функция 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)
только если я действительно хочу установить это поле на ноль. Если я просто не хочу печатать это при форматировании, я бы не назвал это.