首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DateTime解析ThreetenBp会导致DateTimeParseException或不完整的字符串错误

使用DateTime解析ThreetenBp会导致DateTimeParseException或不完整的字符串错误
EN

Stack Overflow用户
提问于 2020-05-04 08:43:35
回答 1查看 397关注 0票数 0

我正在试着检查这个日期是否已超过一天。

当它解析字符串时,我得到了这些errosr。

代码语言:javascript
复制
java.lang.IllegalArgumentException: Pattern ends with an incomplete string literal: uuuu-MM-dd'T'HH:mm:ss'Z
代码语言:javascript
复制
org.threeten.bp.format.DateTimeParseException: Text '2020-04-04T07:05:57+00:00' could not be parsed, unparsed text found at index 19

我的数据示例如下:

代码语言:javascript
复制
val lastDate = "2020-04-04T07:05:57+00:00"
val serverFormat = "uuuu-MM-dd'T'HH:mm:ss'Z"
val serverFormatter =
        DateTimeFormatter
            .ofPattern(serverFormat)
val serverDateTime =
        LocalDateTime
            .parse(
                lastDate,
                serverFormatter
            )
            .atZone(ZoneId.of("GMT"))
val clientDateTime =
        serverDateTime
            .withZoneSameInstant(ZoneId.systemDefault())

val timeDiff =
        ChronoUnit.DAYS.between(
            serverDateTime,
            clientDateTime

我试过这些:

代码语言:javascript
复制
uuuu-MM-dd\'T\'HH:mm:ss\'Z
yyyy-MM-dd\'T\'HH:mm:ss\'Z
uuuu-MM-dd\'T\'HH:mm:ss
uuuu-MM-dd'T'HH:mm:ss'Z
yyyy-MM-dd'T'HH:mm:ss'Z
uuuu-MM-dd'T'hh:mm:ss'Z
yyyy-MM-dd'T'hh:mm:ss'Z
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd HH:mm:ssZ
yyyy-MM-dd'T'HH:mm:ss
yyyy-MM-dd'T'HH:mm:ssZ
yyyy-MM-dd'T'HH:mm:ss

他们都不管用..。正确的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-05 14:20:07

您不需要任何显式格式化程序。在Java中(因为它是我可以编写的):

代码语言:javascript
复制
    String lastDate = "2020-04-04T07:05:57+00:00";
    OffsetDateTime serverDateTime = OffsetDateTime.parse(lastDate);
    ZonedDateTime clientDateTime
            = serverDateTime.atZoneSameInstant(ZoneId.systemDefault());

    System.out.println("serverDateTime: " + serverDateTime);
    System.out.println("clientDateTime: " + clientDateTime);

在我的时区中输出:

serverDateTime: 2020-04-04T07:05:57 z clientDateTime: 2020-04-04T09:05:57+02:00欧洲/哥本哈根

来自服务器的字符串格式为ISO 8601。java.time的类将最常见的ISO8601变体解析为它们的缺省值,也就是说,没有指定任何格式化程序。

由于来自服务器的字符串具有UTC偏移量+00:00,而且没有时区(如亚洲/首尔),因此OffsetDateTime是使用它的最佳和最正确的时间。另一方面,客户端时间有时区,所以ZonedDateTime在这里很好。

由于服务器和客户端时间表示相同的时间,所以差异总是为零:

代码语言:javascript
复制
    Duration difference = Duration.between(serverDateTime, clientDateTime);
    System.out.println(difference);

PT0S

阅读时间为0秒(这也是ISO 8601格式)。

如果您想知道当前时间和服务器时间之间的差异,请使用now()

代码语言:javascript
复制
    Duration difference = Duration.between(serverDateTime, OffsetDateTime.now());
    System.out.println(difference);

你的代码出了什么问题?

首先,字符串中的UTC偏移量是+00:00。任何一种格式模式字母Z或文字Z都不会与此相匹配。所以别那么做。其次,不要将Z作为单引号以格式模式字符串括起来的文字形式提供。当Z显示为偏移量(这是常见的)时,需要将其解析为偏移量,而不是文字。第三,格式模式字符串中的文字文本需要在它之前有一个单引号,在它后面有一个单引号。您正在为中间的T正确地执行此操作。如果你不是想让Z成为一个字面意思,那就不要在它之前加上一个单引号。如果你的意思是字面意思-就像我说的,不要。

链接

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61588271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档