我正在尝试为当前实现此选项的可选时间部分创建日期时间格式
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 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。
我想你想要的是DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS][.S]'Z'")
基本上它首先要检查2+小数位数的长形式,否则如果不存在该可选字段,请检查由[.S]
指定的单个小数位数的可选字段
传递此信息时获得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将会中断。您可能希望包含一些逻辑来处理不同的格式