【问题标题】:Adding trailing zeros to Timestamp string in HH:MM:SS.ssssss format以 HH:MM:SS.ssssss 格式将尾随零添加到时间戳字符串
【发布时间】:2018-07-02 17:46:53
【问题描述】:

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

【问题讨论】:

  • 您是在问如何在 Java 中格式化日期,使用特定格式吗? docs.oracle.com/javase/8/docs/api/java/time/format/…
  • 不,我有一个字符串需要转换成另一个不同格式的字符串。像"2017-06 05T19:27" 这样的字符串中的截断零也不会被解析为时间戳
  • 因此,将字符串解析为日期,并格式化日期。或者,如果您的所有字符串都采用 yyyy-MM-dd'T'HH:mm 形式,则只需连接“:00.000000”。如果这不是您想要的,请编辑您的问题并加以澄清。
  • 你在问什么?如何将该格式的字符串解析为时间戳?如果是这样,请参阅第一条评论,或进行 网络搜索,了解如何在 Java 中解析字符串为日期。那里有无数的例子。
  • 测试字符串的长度,并附加适当的后缀。

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


【解决方案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

【讨论】:

  • 它有所帮助,但我为此编写了逻辑以确保每个案例都像缺少:
  • 我看到了您的回答,感谢您发布它。请参阅我将2017-06-052017-06-05T19 考虑在内的编辑。我确定每个案例的方法是编写一个单元测试来测试所有可以想到的案例。
【解决方案2】:

在下面的代码中使用

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

【讨论】:

  • 如果它满足了您的需求并且您很高兴,我也很高兴。这对我的口味来说有点多的手动工作,并且似乎没有涵盖例如2017-06 05T19:27:00.000(3 位小数而不是 6) ,但只要它涵盖您实际遇到的情况……
猜你喜欢
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2023-01-06
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多