#java #java-11 #java-time
Вопрос:
Java 11
Я хочу преобразовать дату в «гггг-ММ-дд ЧЧ:мм:сс.ССССССС» в «гггг-ММ-дд ЧЧ:мм:сс.С» или «гггг-ММ-дд ЧЧ:мм:сс.СС» на основе значения в миллисекундах. Если миллисекунды-это все нули, то я просто хочу один ноль, но если это ненулевое значение, то я хочу просто значение, не содержащее конечные нули.
Пример :
- Ввод : 2021-03-10 16:37:02.4230000 => Желаемый вывод : 2021-03-10 16:37:02.423
- Ввод : 2021-03-10 16:39:51.0000000 => Желаемый вывод : 2021-03-10 16:39:51.0
- Ввод : 2021-04-22 23:03:52.0234000 => Желаемый вывод : 2021-04-22 23:03:52.0234
Комментарии:
1. Вы не «меняете» формат, классы-контейнеры, например
LocalDateTime
, не имеют понятия о форматировании, вот для чего предназначено aDateTimeFormatter
Ответ №1:
Итак, я начал с чего-то вроде…
String text = "2021-03-10 16:37:02.4230000";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS");
LocalDateTime ldt1 = LocalDateTime.parse("2021-03-10 16:37:02.4230000", formatter);
DateTimeFormatter shortFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
System.out.println(shortFormatter.format(ldt1));
LocalDateTime ldt2 = LocalDateTime.parse("2021-03-10 16:39:51.0000000", formatter);
System.out.println(shortFormatter.format(ldt2));
Который распечатывается …
2021-03-10 16:37:02.4
2021-03-10 16:39:51.0
Хммм, не совсем то, что мы ищем.
К счастью для нас, есть DateTimeFormatterBuilder
класс. Поэтому затем я попробовал что-то вроде…
DateTimeFormatter toFormatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd HH:mm:ss")
.appendFraction(ChronoField.MILLI_OF_SECOND, 1, 9, true)
.toFormatter();
System.out.println(toFormatter.format(ldt1));
System.out.println(toFormatter.format(ldt2));
Который распечатывается …
2021-03-10 16:37:02.423
2021-03-10 16:39:51.0
🎉Успехов
Теперь, пожалуйста, обратите внимание, что я действительно не использовал DateTimeFormatterBuilder
раньше, поэтому, возможно, есть какой-то другой, действительно супер потрясающий классный способ достичь того же или лучшего результата, но, хэй, это хорошее начало
Комментарии:
1. Я считаю это очень хорошим решением. Он, конечно, напечатает 2, 4 или 9 десятичных знаков, если так много ненулевых. Будет ли это приемлемо, может сказать только ОП.
2. Спасибо @MadProgrammer. Это решает мою проблему, просто как я могу заставить это работать в данном случае ? С «2021-04-22 23:03:52.0234000» по «2021-04-22 23:03:52.0234»? Текущая логика возвращает «2021-04-22 23:03:52.023».
3. Это сработало, изменив миллисекунду на наносекунду. DateTimeFormatter toFormatter = новый DateTimeFormatterBuilder() .Шаблон приложения(«гггг-ММ-дд ЧЧ:мм:сс») .Фракция приложения(хронополе.NANO_OF_SECOND, 1, 7, верно) . toFormatter();
4. Полный код : общедоступная статическая строка transformDateFormatsWithMills(дата строки) { DateTimeFormatter toFormatter = новый DateTimeFormatterBuilder() .Шаблон приложения(«гггг-ММ-дд ЧЧ:мм:сс») .Фрагмент приложения(ChronoField.NANO_OF_SECOND, 1, 7, true) . toFormatter(); возвращает LocalDateTime.parse(дата, DateTimeFormatter. ofPattern(«гггг-ММ-дд ЧЧ:мм:сс.ССССССС»)).формат(форматирование); } p s v main(строка[] args) { System.out.println(Преобразователь форматирования(«2021-04-22 23:03:52.0234000»)); }
Ответ №2:
Это также можно сделать с помощью replaceAll
метода String. вы можете удалить завершающие нули в строке даты, если после удаления всех завершающих нулей не осталось ни миллисекунды, а затем добавить .0
private static String getMiliSecond(String input) {
// removing trailing zeros
String miliSecondTrimmed = input.replaceAll("[0.]*$", "");
// if there is there is no mili second left after removing zeros, append .0
return (!miliSecondTrimmed.contains("."))?(miliSecondTrimmed (".0").toString()):miliSecondTrimmed;
}
Этот код вызывается из основного метода
public static void main(String[] args) {
String input1 ="2021-03-10 16:39:51.0000000";
String input2 = "2021-03-10 16:37:02.4230000";
String miliSecond1 = getMiliSecond(input1);
String miliSecond2 = getMiliSecond(input2);
System.out.println("input1 mili:" miliSecond1);
System.out.println("input2 mili:" miliSecond2);
}
Выход:
input1 mili:2021-03-10 16:39:51.0
input2 mili:2021-03-10 16:37:02.423