ThreeTenABP无法解析日期

时间:2016-10-07 03:38:04

标签: android date datetime timezone

我正在尝试将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 个答案:

答案 0 :(得分:6)

@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(); 

答案 1 :(得分:2)

您需要使用Instant.parse()

这会为您提供Instant,您可以将其与时区结合使用以创建LocalDate

答案 2 :(得分:1)

在科特林:

直接根据您的本地时区转换为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()