【发布时间】:2021-11-30 09:54:57
【问题描述】:
如何将作为字符串 2018-08-10T18:25:00.000+0000 传递的日期时间转换为 Instant?我尝试了以下方法,但没有成功。
public static Instant toInstant(final String timeStr) {
if (StringUtils.isBlank(timeStr)) {
throw new IllegalArgumentException("Invalid date time value passed [" + timeStr + "]");
}
try {
return LocalDate.parse(timeStr).atStartOfDay().toInstant(ZoneOffset.UTC);
} catch (Exception e) {
try {
return LocalDateTime.parse(timeStr).toInstant(ZoneOffset.UTC);
} catch (Exception e1) {
try {
return ZonedDateTime.parse(timeStr).toInstant();
} catch (Exception e2) {
try {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return LocalDateTime.parse(timeStr, formatter).toInstant(ZoneOffset.UTC);
} catch (Exception e3) {
try {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
return LocalDateTime.parse(timeStr, formatter).toInstant(ZoneOffset.UTC);
} catch (Exception e4) {
try {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
return LocalDateTime.parse(timeStr, formatter).toInstant(ZoneOffset.UTC);
} catch (Exception e5) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
return LocalDateTime.parse(timeStr, formatter).toInstant(ZoneOffset.UTC);
} finally {
throw new IllegalArgumentException("Incorrect date time value passed [" + timeStr + "]");
}
}
}
}
}
}
}
【问题讨论】:
-
简单的
OffsetDateTime.parse(...).toInstant()有什么问题?为什么要多次尝试? -
"2018-08-10T18:25:00.000+0000" 不符合 ISO 标准,但 "2018-08-10T18:25:00.000+00:00" 符合标准。 (注意添加的冒号。)如果使用正确的格式,可以使用
Instant instant = Instant.parse("2018-08-10T18:25:00.000+00:00"); -
@Seelenvirtuose
Instant.parse更短。 -
@k314159 该字符串确实符合 ISO 8601。有趣的是,单参数
OffsetDateTime.parse(CharSequence)不接受它。参见例如Why can't OffsetDateTime parse '2016-08-24T18:38:05.507+0000' in Java 8
标签: java java-time timezone-offset datetimeformatter java.time.instant