我正在尝试将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
解决方案在下面的答案中。对于遇到这种情况的任何人,如果要指定自定义输出格式,可以使用:
String format = "MMMM dd, yyyy \'at\' HH:mm a";
String dateString = DateTimeFormatter.ofPattern(format).withZone(ZoneId.systemDefault()).format(instant);
答案 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()