【问题标题】:How to parse LocalDateTime to two digits millis in the end? Java最后如何将 LocalDateTime 解析为两位数毫秒?爪哇
【发布时间】:2022-01-07 01:07:18
【问题描述】:

我想将 LocalDateTime 2021-11-24T15:11:38.395 解析为 LocalDateTime 2021-11-24T15:11:38.39。但是 LocalDateTime.parse() 最后总是加零,忽略我的模式。

public class DateTimeFormatUtils {
    private static final String ISO_DATE_TIME = "yyyy-MM-dd'T'HH:mm:ss.SS";

    public static LocalDateTime formatToISO(final LocalDateTime localDateTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(ISO_DATE_TIME);
        return LocalDateTime.parse(formatter.format(localDateTime), formatter);
    }

    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);
        System.out.println(formatToISO(now));
    }

}

输出:

2021-11-30T11:48:28.449195200
2021-11-30T11:48:28.440

有没有办法解决这个问题?

【问题讨论】:

标签: java datetime datetime-format


【解决方案1】:

请注意,字符串“2021-11-24T15:11:38.39”和“2021-11-24T15:11:38.390”代表相同的LocalDateTime。从技术上讲,您已经获得了预期的输出!

由于您说输出不是您所期望的,因此您实际上期望 String 作为输出,因为“2021-11-24T15:11:38.39”和“2021-11-24T15:11:38.390” " 是不同的字符串formatToISO 应该返回一个字符串 - 您不应该将格式化的日期解析回 LocalDateTime

public static String formatToISO(final LocalDateTime localDateTime) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(ISO_DATE_TIME);
    return formatter.format(localDateTime);
}

这类似于初学者打印出doubles 并期望他们用来分配给变量的特定格式的常见错误。

double d = 5;
System.out.println(d); // expected 5, actual 5.0

LocalDateTime,就像double,不存储任何关于它应该如何格式化的信息。它只是存储了一个,同样的值会以同样的方式被格式化。

【讨论】:

    【解决方案2】:

    Java 小数秒总是返回 3 位数字。

    解决方法是,首先将 LocalDateTime 转换为字符串,然后删除字符串的最后一个字符。

    当然,请验证空检查。

    private static String removeLastDigit(String localDateTime) {
            return localDateTime.substring(0, localDateTime.length()-1);
     }
    

    【讨论】:

      猜你喜欢
      • 2012-05-22
      • 1970-01-01
      • 2011-01-10
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      相关资源
      最近更新 更多