yco*_*omp 9 java datetime java-8 java-time
我昨天创造了这个精彩的静态方法,它工作得很好 - 昨天
但是,今天它给了我这个错误.我想这是从Z之前的太多0.
任何人都可以推荐如何以简洁的方式(Java 8)解析这种类型的String
格式日期 - 请记住它昨天ISO_INSTANT
也有效,所以也是一种有效的格式String
?
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1443451604, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed
at java.time.LocalDate.from(LocalDate.java:368)
at java.time.LocalDateTime.from(LocalDateTime.java:456)
... 9 more
Run Code Online (Sandbox Code Playgroud)
在输入时间抛出异常:"2015-09-28T14:46:44.000000Z"
/**
*
* @param time the time in RFC3339 format (e.g. "2013-07-03T14:30:38Z" )
* @return
*/
public static LocalDateTime parseTimeINSTANT(String time) {
DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT;
return LocalDateTime.from(f.parse(time));
}
Run Code Online (Sandbox Code Playgroud)
Tun*_*aki 17
您正在解析与ISO即时一致的String,因此您需要将结果存储在a Instant
而不是LocalDateTime
:
public static Instant parseTimeINSTANT(String time) {
DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT;
return Instant.from(f.parse(time)); // could be written f.parse(time, Instant::from);
}
Run Code Online (Sandbox Code Playgroud)
请注意,此格式化程序正确处理小数秒,因此您无需删除它们.引用DateTimeFormatter.ISO_INSTANT
Javadoc(强调我的):
解析时,至少需要秒时间字段.解析从零到九的小数秒.
至于为什么它昨天而不是今天工作,我不知道......
只是为了帮助任何人以后看到这个问题。
您需要将 ISO 日期解析为Instant
,将其转换为Instant
对象,然后LocalDateTime
从中创建一个提供区域 ID 的对象。我在这里设置UTC的区域ID。
代码如下
public static LocalDateTime getISODate(String dateString) {
DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_INSTANT;
Instant dateInstant = Instant.from(isoFormatter.parse(dateString));
LocalDateTime date = LocalDateTime.ofInstant(dateInstant, ZoneId.of(ZoneOffset.UTC.getId()));
return date;
}
Run Code Online (Sandbox Code Playgroud)
DateTimeFormatter
将符合 ISO 8601 的日期时间字符串直接解析为Instant
using Instant#parse
. 现代日期时间 API 基于ISO 8601DateTimeFormatter
,只要日期时间字符串符合 ISO 8601 标准,就不需要显式使用对象。
演示:
import java.time.Instant;
public class Main {
public static void main(String[] args) {
Instant instant = Instant.parse("2015-09-28T14:46:44.000000Z");
System.out.println(instant);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
2015-09-28T14:46:44Z
Run Code Online (Sandbox Code Playgroud)
Instant
可以转换为其他java.time
类型,例如
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
Instant instant = Instant.parse("2015-09-28T14:46:44.000000Z");
System.out.println(instant);
LocalDateTime ldt = instant.atZone(ZoneOffset.UTC).toLocalDateTime();
System.out.println(ldt);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
2015-09-28T14:46:44Z
2015-09-28T14:46:44
Run Code Online (Sandbox Code Playgroud)
从Trail: Date Time中了解有关现代日期时间 API 的更多信息。