【问题标题】:ThreeTenABP not parsing dateThreeTenABP 不解析日期
【发布时间】:2017-02-15 23:08:44
【问题描述】:

我正在尝试将 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。日期时间生成器

编辑 2

解决方案在下面的答案中。对于任何偶然发现这一点的人,如果您想指定自定义输出格式,您可以使用:

String format = "MMMM dd, yyyy \'at\' HH:mm a";
String dateString = DateTimeFormatter.ofPattern(format).withZone(ZoneId.systemDefault()).format(instant);

【问题讨论】:

    标签: android date datetime timezone


    【解决方案1】:

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

    【讨论】:

    • 我希望有一千个人对你的答案 Reddy 投票。那工作得很好。在我看来,ThreeTen 文档很差,所以你上面的答案是解析时区日期字符串的最佳资源。非常感谢
    • 如果我想从 java.util.Date 更改为 iso String 怎么办?
    【解决方案2】:

    您需要使用Instant.parse()

    这将为您提供一个Instant,您可以将其与时区组合以创建一个LocalDate

    【讨论】:

    • 对现有时间戳有效吗? IE。 2016-09-24T06:24:01Z
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2013-08-13
      • 2016-04-30
      • 2013-07-10
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多