【问题标题】:ISO8601 to epoch millisecondsISO8601 到纪元毫秒
【发布时间】:2020-01-11 09:44:38
【问题描述】:

我正在将我的 ISO8601 字符串格式解析为毫秒,到目前为止我遇到了一个错误

还有更好的方法,因为它需要 API 26

Text '2019-02-15T00:00:00' could not be parsed at index 19

        val millisecondsSinceUnixEpoch = instant.toEpochMilli()
        println("EPOCH $millisecondsSinceUnixEpoch")

【问题讨论】:

  • 欢迎来到 Stack Overflow。我想我理解这个问题,但如果你能在问题中添加a Minimal, Reproducible Example 会更清楚(使用标签行下的编辑链接)。

标签: android kotlin epoch iso8601


【解决方案1】:

你的错误

您的字符串为我们提供了日期 (2019-02-15) 和一天中的时间 (00:00:00)。它没有给我们任何时区或 UTC 偏移量。如果没有后者,我们就无法知道一个唯一的时间点,这是从纪元开始转换为毫秒所必需的。如果您知道日期时间字符串中隐含的时区,则可以进行如下转换。很抱歉我只能写Java代码。

    ZoneId zone = ZoneId.of("America/St_Barthelemy");
    String dateTimeText = "2019-02-15T00:00:00";
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeText);
    long millisecondsSinceUnixEpoch = dateTime.atZone(zone)
            .toInstant()
            .toEpochMilli();
    System.out.println("EPOCH " + millisecondsSinceUnixEpoch);

现在输出是:

纪元 1550203200000

如果不是美国/St_Barthelemy,请替换您的时区。 LocalDateTime 是一个没有 tme 区域或偏移量的日期和时间,所以这个类解析你的字符串没有错误。接下来我们使用已知的时区进行转换。

你的异常信息说:

Text '2019-02-15T00:00:00' could not be parsed at index 19

索引 19 是字符串的结尾,因此错误消息表明那里缺少某些内容。假设您使用的是Instant.parse()(您的问题没有说明),@Lenin 在另一个答案中是正确的,即Instant.parse() 预计解析的字符串以Z 结束“祖鲁时区”或UTC 或偏移量为零.

……它需要 API 26

好消息是它不需要 API 级别 26。Instant 和我们一直在使用的其他类属于 java.time,现代 Java 日期和时间 API。此 API 已被反向移植。

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 或 Android 8.0 及更高版本)中内置了现代 API。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
  • 在 API 级别 26 (Android 8.0) 之前的 Android 上,使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    【解决方案2】:

    您必须在最后添加格式。尝试“2019-02-15T00:00:00Z”。 Z 表示祖鲁时间,即 +0 偏移量

    【讨论】:

    • 是的,如果我们知道字符串在祖鲁语时间/偏移 +00:00 中。不知道是不是。
    猜你喜欢
    • 2017-10-09
    • 1970-01-01
    • 2012-02-19
    • 2023-03-27
    • 1970-01-01
    • 2015-07-07
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多