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

时间:2018-01-23 19:45:53

标签: java timestamp datetime-format time-format trailing

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

2 个答案:

答案 0 :(得分:1)

    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

答案 1 :(得分:0)

在下面的代码中使用

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