ThreeTenABP无法解析日期

4

我正在尝试将ISO 8601时间转换为可读的本地时区Android设备的格式。

String date = "2016-09-24T06:24:01Z";
LocalDate test = LocalDate.parse(date, ISO_INSTANT);

但是它返回了:

方法抛出'org.threeten.bp.format.DateTimeParseException'异常

从阅读http://www.threeten.org/threetenbp/apidocs/org/threeten/bp/format/DateTimeFormatter.html#ISO_INSTANT来看,我正在做的事情似乎是可能的。
我做错了什么?

编辑

扩展异常错误:

无法从TemporalAccessor获取LocalDate:DateTimeBuilder[fields={MilliOfSecond=0, NanoOfSecond=0, InstantSeconds=1474698241, MicroOfSecond=0}, ISO, null, null, null],类型为org.threeten.bp.format.DateTimeBuilder

编辑2

解决方案在下面的答案中。对于任何遇到这个问题的人,如果您想指定自定义输出格式,则可以使用:
String format = "MMMM dd, yyyy \'at\' HH:mm a";
String dateString = DateTimeFormatter.ofPattern(format).withZone(ZoneId.systemDefault()).format(instant);
3个回答

11

@alex的答案是正确的。这里有一个可行的例子。

Instant代表时间点。如果要转换为其他本地类型,你需要时区信息。

String date = "2016-09-24T06:24:01Z";

使用DateTimeFormatter#ISO_INSTANT内部解析此日期字符串。

Instant instant = Instant.parse(date);

从这里开始,您可以使用时区(默认为系统时区)将其转换为其他本地类型。

LocalDateTime localDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDate localDate = instant.atZone(ZoneId.systemDefault()).toLocalDate();
LocalTime localTime = instant.atZone(ZoneId.systemDefault()).toLocalTime();

或者,您可以使用静态方法获取本地日期时间,然后获取本地日期和时间。

LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
LocalDate localDate = localDateTime.toLocalDate();
LocalTime localTime = localDateTime.toLocalTime(); 

2
希望有一千人点赞你的回答,Reddy。那个方法完美地解决了问题。我认为ThreeTen文档相当贫乏,所以你上面的回答是可以找到用于解析带时区日期字符串的最佳资源。非常感谢。 - b85411
如果我想从java.util.Date更改为ISO字符串怎么办? - amlwin

3
你需要使用 Instant.parse()
这会给你一个 Instant 对象,可以与时区结合创建一个 LocalDate

1
这个能适用于现有的时间戳吗?例如 2016-09-24T06:24:01Z - b85411

1
在 Kotlin 中:
直接基于您的本地时区将其转换为 LocalDateTime:
val instant: Instant = Instant.parse("2020-04-21T02:22:04Z")
val localDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime() 

根据您的本地时区分别转换为日期和时间:

val localDate: LocalDate = instant.atZone(ZoneId.systemDefault()).toLocalDate()
val localTime: LocalTime = instant.atZone(ZoneId.systemDefault()).toLocalTime()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接