我正在尝试将 ISO 8601 时间转换为人类可读且符合 Android 设备本地时区的时间。
String date = "2016-09-24T06:24:01Z";
LocalDate test = LocalDate.parse(date, ISO_INSTANT);
但它返回:
method threw 'org.threeten.bp.format.DateTimeParseException' exception
来自阅读http://www.threeten.org/threetenbp/apidocs/org/threeten/bp/format/DateTimeFormatter.html#ISO_INSTANT看起来我正在做的事情应该是可能的。
我做错了什么?
编辑
扩展异常错误:
Unable to obtain LocalDate from TemporalAccessor: 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();
关于android - ThreeTenABP 不解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39908964/