Java преобразует дату и время из «гггг-ММ-дд ЧЧ:мм:сс.ССССССС» в «гггг-ММ-дд ЧЧ:мм:сс.С» или из «гггг-ММ-дд ЧЧ:мм:сс.ССССССС» в «гггг-ММ-дд ЧЧ:мм:сс.ССССССС»

#java #java-11 #java-time

Вопрос:

Java 11

Я хочу преобразовать дату в «гггг-ММ-дд ЧЧ:мм:сс.ССССССС» в «гггг-ММ-дд ЧЧ:мм:сс.С» или «гггг-ММ-дд ЧЧ:мм:сс.СС» на основе значения в миллисекундах. Если миллисекунды-это все нули, то я просто хочу один ноль, но если это ненулевое значение, то я хочу просто значение, не содержащее конечные нули.

Пример :

  1. Ввод : 2021-03-10 16:37:02.4230000 => Желаемый вывод : 2021-03-10 16:37:02.423
  2. Ввод : 2021-03-10 16:39:51.0000000 => Желаемый вывод : 2021-03-10 16:39:51.0
  3. Ввод : 2021-04-22 23:03:52.0234000 => Желаемый вывод : 2021-04-22 23:03:52.0234

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

1. Вы не «меняете» формат, классы-контейнеры, например LocalDateTime , не имеют понятия о форматировании, вот для чего предназначено a DateTimeFormatter

Ответ №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