我正在尝试将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()