具有毫秒精度但可选微秒精度的 Java LocalDateTime.parse

标签 java datetime parsing

有没有一种方法可以创建一个 LocalDateTime 模式,该模式将解析至少具有毫秒精度但可选微秒精度的日期/时间,即在接下来的毫秒日期/时间中解析正常,但第二个以微秒为单位的日期/时间失败。我认为模式“[”“]”中的可选指示器将允许这项工作:

DateTimeFormatter DATE_TIME_FORMATTER = 
    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS[SSS]");
System.out.println(LocalDateTime.parse("2019-02-14 11:04:52.784", DATE_TIME_FORMATTER));     
System.out.println(LocalDateTime.parse("2019-02-14 11:04:52.784108", DATE_TIME_FORMATTER));

最佳答案

黑客没有。 1

    String withMillis = "2019-02-14 11:04:52.784";
    String withMicros = "2019-02-14 11:04:52.784108";

    System.out.println(LocalDateTime.parse(withMillis.replace(' ', 'T')));
    System.out.println(LocalDateTime.parse(withMicros.replace(' ', 'T')));
2019-02-14T11:04:52.784
2019-02-14T11:04:52.784108

当我们用 T 替换字符串中间的空格时,该字符串符合 ISO 8601,LocalDateTime 和其他 java 类的标准格式.time 解析(并打印)为默认值,即没有任何显式格式化程序。所以这是一个简单的解决方案。

黑客没有。 2

可以使您尝试过的类似方法发挥作用。只是不能用中间的方括号拆分 SSSSSS 序列。

static final DateTimeFormatter DATE_TIME_FORMATTER = 
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.[SSSSSS][SSS]");

然后:

    System.out.println(LocalDateTime.parse(withMillis, DATE_TIME_FORMATTER));     
    System.out.println(LocalDateTime.parse(withMicros, DATE_TIME_FORMATTER));

我指定可选的 6 位小数,然后可选地指定 3 位小数。我们需要那个命令。如果我们放入 [SSS][SSSSSS] 并尝试解析 6 位小数,格式化程序将首先解析 3 位然后抛出异常,因为它无法使用 SSSSSS 解析剩余的 3 位.这有点 hack,因为它也接受一个没有小数的小数点,如果我们给它 9 位小数,它可能会发出一个非常困惑的错误消息(甚至可能给出不正确的结果)。

好的解决方案:使用构建器

编辑:从这个答案的第一个版本开始,我对构建器做了一些改进:

static final DateTimeFormatter DATE_TIME_FORMATTER = 
        new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
                .appendLiteral(' ')
                .append(DateTimeFormatter.ISO_LOCAL_TIME)
                .toFormatter();

DateTimeFormatter.ISO_LOCAL_TIME 在秒上解析 0 到 9 位小数,因此我们只需在我们自己的格式化程序中重用该格式化程序。

原始构建器:

static final DateTimeFormatter DATE_TIME_FORMATTER = 
        new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
                .appendLiteral(' ')
                .appendPattern("HH:mm:ss")
                .appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true)
                .toFormatter();

这里我指定了小数点后最少1位,最多9位小数。如果您愿意,可以指定 3 和 6。它当然也会接受 4 或 5。

链接: Wikipedia article: ISO 8601

关于具有毫秒精度但可选微秒精度的 Java LocalDateTime.parse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54682028/

相关文章:

java - 有没有解析用户代理字符串的好方法?

java - 如何从 AffineTransform 派生的形状对象中获取 'Get' 特定点

java - 如何修复多项目 GWT 设置中的 RPC 错误 IncompleteRemoteServiceException?

python - 将抓取的结果集保存到 CSV 文件中

javascript - 如何使用 momentjs 获取特定时区日期时间值

datetime - 如何使用 UTC 时区偏移量格式化 DateTime?

Shell脚本从过去一小时的日志中获取异常

java - 如何通过 ListView 传递数据,Android - Java

java - Eclipse 找不到 JFace 中的主类?

python - "2016-10-22T16:27:54+0000"格式转换为日期时间