LocalDateTime到底怎么解析成两位数毫秒? Java

How to parse LocalDateTime to two digits millis in the end? Java

我想将 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 小数秒总是 return 3 位数。

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

不对,请验证空检查。

private static String removeLastDigit(String localDateTime) {
        return localDateTime.substring(0, localDateTime.length()-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 应该 return 一个字符串 - 你不应该将格式化的日期解析回 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 一样,不存储任何关于它应该如何格式化的信息。它只是存储一个,相同的值将以相同的方式格式化。