以 HH:MM:SS.ssssss 格式向时间戳字符串添加尾随零

Adding trailing zeros to Timestamp string in HH:MM:SS.ssssss format

将字符串表示时间戳视为 "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 的任何字段中截断零。如果时间戳的尾部有一系列零,它将被截断

    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-052017-06-05T192017-06-05T19:272017-06-05T19:27:102017-06-05T19:27:10.917360,但不适用于 2017-06-05T19:27:10.917.

为此目的使用下面的代码

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;
}