Формат SimpleDateFormat удаляет начальный ноль из миллисекунд

#java

#java

Вопрос:

У меня возникли трудности с форматированием миллисекунд с помощью SimpleDateFormat. Я пытаюсь получить точный миллисекундный вывод с шаблоном «SS», но когда миллисекунда начинается с нуля, SimpleDateFormat.format() удалит начальный ноль и вернет оставшиеся цифры.

Например, я ожидаю получить вывод «08», но вместо этого я получаю «87» со времени 02: 20: 48.087 с шаблоном формата «SS» или «S».

В javadoc указано, что выходные данные двухбуквенного шаблона интерпретируются как числа, но такая же проблема возникает и с одной буквой S.

 SimpleDateFormat test = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS");
Calendar testCalendar = Calendar.getInstance();
long unixtime = 435457248087L; // 1983-10-20 02:20:48.087
testCalendar.setTimeInMillis(unixtime);

String output = test.format(testCalendar.getTime());
System.out.println(output); // outputs 1983-10-20 02:20:48.87, not xxx.08
  

Это, конечно, легко исправляется с помощью шаблона «SSS», но мне просто любопытно, это ошибка или в чем подвох с этим.

Комментарии:

1. О да, действительно, виноват. Я должен был написать «08».

Ответ №1:

SS это просто «количество миллисекунд, дополненное 0, если необходимо, чтобы получить двухзначный результат». Таким образом, похоже, что он ведет себя так, как ожидается в документации.

Лично я думаю, что было бы разумнее, если бы было указано (и реализовано) указывать 08 как долю секунды с точностью до 2 знаков после запятой — к сожалению, это работает не так.

Я не думаю, что есть какой-либо способ указать «долю секунды до 2 знаков после запятой», используя SimpleDateFormat .

Комментарии:

1. Да, вы правы, и это то, что я написал в первую очередь. Я должен был написать «08», а не «087». Мой плохой и теперь отредактированный.

2. @noini: Хорошо, я отредактировал свой ответ — в основном он ведет себя так, как ожидалось, просто не обязательно так, как вы хотели бы , чтобы он вел себя.