ThreeTenABP不解析日期



我正在尝试将ISO 8601时间转换为人类可读的东西,并在Android设备的本地时区。

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

但是它返回:

方法抛出了'org.three .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], type 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);

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

您需要使用Instant.parse()

这将给你一个Instant,你可以结合一个时区创建一个LocalDate

In 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()

相关内容

  • 没有找到相关文章