Добавление завершающих нулей к строке Timestamp в формате HH:MM:SS.ssssss

Рассмотрим временную метку строкового представления как "2017-06-05T19:27:10.917360". Но если есть непрерывные конечные нули до вышеуказанной метки времени, восходящая система усекает нули для секунд и миллисекунд в приведенном выше примере, например "2017-06 05T19:27:00.000000"
Есть ли какой-либо форматировщик, доступный в java, для добавления конечного нуля в определенном формате, включая разделитель как : между часами, минутами и секунды.

Например: "2017-06-05" следует преобразовать в "2017-06-05T00:00:00.000000"
Редактировать: - Нули могут быть усечены из любого поля HH, MM, SS. Если в хвосте есть серия нулей для метки времени, она будет усечена.


person Mayur    schedule 23.01.2018    source источник
comment
Вы спрашиваете, как отформатировать дату в Java, судя по определенному формату? docs.oracle.com/javase/8/ документы/api/java/время/формат/   -  person JB Nizet    schedule 23.01.2018
comment
Нет, у меня есть строка, которую нужно преобразовать в другую строку с другим форматом. Также усеченные нули в такой строке "2017-06 05T19:27" не будут преобразованы в отметку времени.   -  person Mayur    schedule 23.01.2018
comment
Итак, проанализируйте строку на дату и отформатируйте дату. Или, если все ваши строки имеют форму гггг-ММ-дд'Т'ЧЧ:мм, просто соедините :00.000000. Если это не то, что вы хотите, отредактируйте свой вопрос и уточните его.   -  person JB Nizet    schedule 23.01.2018
comment
А что ты спрашиваешь? Как разобрать строку в этом формате в метку времени? Если это так, см. первый комментарий или выполните поиск в Интернете, чтобы узнать, как анализировать строку на сегодняшний день в Java. Есть gazillion примеров там.   -  person Andreas    schedule 23.01.2018
comment
проверьте длину строки и добавьте соответствующий суффикс.   -  person JB Nizet    schedule 24.01.2018
comment
Совет: постарайтесь дать вашему вопросу правильные теги, чтобы привлечь больше внимания людей, которые думают, что они что-то знают о предмете, о котором вы спрашиваете.   -  person Ole V.V.    schedule 28.01.2018


Ответы (2)


    DateTimeFormatter desiredFormatter 
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSS");
    String truncatedDateTimeString = "2017-06-05T19:27";
    LocalDateTime dateTime = LocalDateTime.parse(truncatedDateTimeString);
    String fixedDateTimeString = dateTime.format(desiredFormatter);
    System.out.println(fixedDateTimeString);

Это печатает

2017-06-05T19:27:00.000000

Однако, если минуты и часы отсутствуют, нам нужно еще немного хитрости. Посмотрите на DateTimeFormatterBuilder и его метод parseDefaulting. Используйте квадратные скобки [] в строке шаблона формата, чтобы окружить части, которые могут отсутствовать. Я не уверен, как будет выглядеть ваша строка, если часы были усечены — T тоже будет отсутствовать?

С другой стороны, приведенное выше также работает, если строка была 2017-06-05T19:27:10.917360, и в этом случае просто печатает ту же строку обратно.

Также я не уверен, какую проблему вы действительно пытаетесь решить. Нули в конце избыточны, так в чем проблема их усечения?

Редактировать. Следующий метод конкретизирует то, что я сказал о DateTimeFormatterBuilder, его методе parseDefaulting и квадратных скобках в строке шаблона формата:

public static String addTrailingZerosToTimestamp(String timeStamp) {
    DateTimeFormatter truncatedFormatter = new DateTimeFormatterBuilder()
            .appendPattern("uuuu-MM-dd['T'HH[:mm[:ss[.SSSSSS]]]]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
            .parseDefaulting(ChronoField.NANO_OF_SECOND, 0)
            .toFormatter();
    DateTimeFormatter desiredFormatter 
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSS");
    LocalDateTime dateTime = LocalDateTime.parse(timeStamp, truncatedFormatter);
    return dateTime.format(desiredFormatter);
}

Он работает с 2017-06-05, 2017-06-05T19, 2017-06-05T19:27, 2017-06-05T19:27:10 и 2017-06-05T19:27:10.917360, но не с 2017-06-05T19:27:10.917.

person Ole V.V.    schedule 28.01.2018
comment
Это помогло, но я написал логику для этого, чтобы быть уверенным в каждом случае, например, при отсутствии :. - person Mayur; 09.02.2018
comment
Я вижу ваш ответ, и спасибо за публикацию. Смотрите мое редактирование, которое учитывает 2017-06-05 и 2017-06-05T19. Мой способ быть уверенным в каждом случае — написать модульный тест, который проверяет все мыслимые случаи. - person Ole V.V.; 09.02.2018

Используется ниже кода для цели

public static String addTrailingZerosToTimestamp(String timeStamp) {
    String param = timeStamp;
    String newCmitTime = "";
    if (param.length() < 26) {

        String currentCmitDate = param.substring(0, 10);
        if (param.length() <= 11) {
            param = currentCmitDate + "T" + "00:00:00.000000";

        } else {
            String currentCmitTime = param.substring(11, param.length());

            String[] timeSplit = currentCmitTime.split("\\:|\\.");

            switch (timeSplit.length) {
                case 4:
                    newCmitTime = currentCmitTime;
                    break;
                case 3:
                    newCmitTime = currentCmitTime + ".000000";
                    break;
                case 2:
                    newCmitTime = currentCmitTime + ":00.000000";
                    break;
                case 1:
                    newCmitTime = currentCmitTime + ":00:00.000000";
                    break;
                case 0:
                    newCmitTime = currentCmitTime + "00:00:00.000000";
                    break;
            }
            param = currentCmitDate + "T" + newCmitTime;
       }
    } else {
        return param;
    }
    return param;
}
person Mayur    schedule 08.02.2018
comment
Если это удовлетворяет ваши потребности, и вы довольны, я тоже. На мой вкус, это немного ручная работа, и, похоже, она не покрывает, например, 2017-06 05T19:27:00.000 (3 десятичных знака вместо 6), но до тех пор, пока она охватывает случаи, которые вы на самом деле встретимся… - person Ole V.V.; 09.02.2018