Java 8可选时间部分无法正常工作

问题描述 投票:11回答:3

我正在尝试为当前实现此选项的可选时间部分创建日期时间格式

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.text.ParseException;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(Ideone.getDate("2017-07-01T00:00:00.0Z"));
        System.out.println(Ideone.getDate("2017-07-01T00:00:00.00Z"));
        System.out.println(Ideone.getDate("2017-07-01T00:00:00.000Z"));
    }

    public static LocalDateTime getDate(String date) {
        try {

            DateTimeFormatter formatter2 =
                DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS]'Z'");
            LocalDateTime ldt = LocalDateTime.parse(date, formatter2);


            return ldt;

        } catch (DateTimeParseException ex) {
            return null;
        }
    }
}

并有输出

空值

2017-07-01T00:00

2017-07-01T00:00

现在我的问题是,为什么有1个时间分数的日期不起作用,它正在处理2个和3个分数?它应该招待1,2和3分吗?或只有3个分数?

提前致谢

java java-8 datetime-format java-time
3个回答
1
投票

这似乎是一个错误。日期时间解析的毫秒部分似乎是Java 8中的常见错误,请参阅this issue及其重复项。

相关报价:

然而更糟糕的是,当宽松模式适当时,SSS模式因此最终使用严格模式。就目前而言,DateTimeFormatter.ofPattern(“hhmmss.SSS”)需要三位数毫秒,当它最初打算要求0到9(宽松行为)时。

鉴于当前实现需要SSS的三个数字,因此非常令人惊讶的是相邻值解析不适用。

但是您似乎找到了上述要求也不适用的情况。另外,即使上面的问题处于“固定”状态,你的例子似乎在java 8和java 9中也存在问题:

>java -version
java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)

>javac Ideone.java

>java Ideone
null
2017-07-01T00:00
2017-07-01T00:00

>"c:\Program Files\Java\jdk1.8.0\bin"\javac Ideone.java

>"c:\Program Files\Java\jdk1.8.0\bin"\java Ideone
null
2017-07-01T00:00
2017-07-01T00:00

它应该招待1,2和3分吗?或只有3个分数?

根据报价,它应该只有3,虽然最初打算是0-9。


-1
投票

我想你想要的是DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS][.S]'Z'")

基本上它首先要检查2+小数位数的长形式,否则如果不存在该可选字段,请检查由[.S]指定的单个小数位数的可选字段


-2
投票

传递此信息时获得null的原因是

“2017-07-01T00:00:00.0Z”

你告诉解析器期望3个字符格式(见下文.SSS)

DateTimeFormatter.ofPattern( “YYYY-MM-dd'T'HH:MM:SS [.SSS] 'Z'”);

如果您将其更改为.SS,它应该可以工作,但是您的上一次输入,即2017-07-01T00:00:00.000Z将会中断。您可能希望包含一些逻辑来处理不同的格式

© www.soinside.com 2019 - 2024. All rights reserved.