首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >毫秒精度可选微秒精度的Java LocalDateTime.parse

问毫秒精度可选微秒精度的Java LocalDateTime.parse
EN

Stack Overflow用户
提问于 2019-02-14 01:40:38
回答 1查看 3.3K关注 0票数 6

是否有一种方法可以创建一个LocalDateTime模式,该模式将解析至少具有毫秒精度但可选的微秒精度的日期/时间,即在随后的毫秒日期/时间被解析为ok,但第二个模式在微秒内失败。我认为“模式中的可选指标将允许这项工作:

代码语言:javascript
复制
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));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-14 08:08:59

1号黑客

代码语言:javascript
复制
    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替换字符串中间的空格时,字符串符合ISO8601的标准格式,这是LocalDateTime和其他类java.time解析(也是打印)的默认格式,即没有任何显式格式化程序。所以这是一个简单的解决方案。

2号黑客

就像你试过的一样可以发挥作用。只有您不能用中间的方括号分割SSSSSS序列。

代码语言:javascript
复制
static final DateTimeFormatter DATE_TIME_FORMATTER = 
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.[SSSSSS][SSS]");

然后:

代码语言:javascript
复制
    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。这有点麻烦,因为它也会接受小数点,一点小数点都没有,如果我们给出9个小数,它可能会发出一个非常混乱的错误信息(甚至可能给出一个不正确的结果)。

好的解决方案:使用一个建设者。

编辑:自从这个答案的第一个版本以来,我对构建器做了一点改进:

代码语言:javascript
复制
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个小数,所以我们只在自己的格式化程序中重用该格式化程序。

原建筑商:

代码语言:javascript
复制
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。

链接: 维基百科文章: ISO 8601

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54682028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档