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

Android 使用ThreetenBp分析DateTime会导致DateTimeParseException或不完整的字符串错误,android,datetime-parsing,threetenbp,android-jodatime,threetenabp,Android,Datetime Parsing,Threetenbp,Android Jodatime,Threetenabp,我正在检查日期是否超过一天 当它解析字符串时,我得到了这些数据 java.lang.IllegalArgumentException: Pattern ends with an incomplete string literal: uuuu-MM-dd'T'HH:mm:ss'Z 我的数据示例如下: val lastDate = "2020-04-04T07:05:57+00:00" val serverFormat = "uuuu-MM-dd'T'HH:mm:ss'Z" val serverF

我正在检查日期是否超过一天

当它解析字符串时,我得到了这些数据

java.lang.IllegalArgumentException: Pattern ends with an incomplete string literal: uuuu-MM-dd'T'HH:mm:ss'Z
我的数据示例如下:

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

我试过这些:

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

他们都没有工作。。。正确的方法是什么?

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

我的时区中的输出:

服务器中字符串的格式为ISO 8601。time类将最常见的ISO 8601变体解析为默认变量,也就是说,不指定任何格式化程序

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

由于服务器时间和客户端时间表示相同的时间,因此差值始终为零:

    Duration difference = Duration.between(serverDateTime, clientDateTime);
    System.out.println(difference);
以0秒的时间段读取(这也是ISO 8601格式)

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

你的代码出了什么问题? 首先,字符串中的UTC偏移量是
+00:00
。一个格式模式字母
Z
和一个文字
Z
都与此不匹配。所以不要试着那样做。其次,千万不要在格式模式字符串中以单引号括起来的文字形式给出
Z
。当
Z
显示为偏移量(这是常见的)时,您需要将其解析为偏移量,而不是文本。第三,格式模式字符串中的文本需要在前面有一个引号,在后面有一个引号。您在中间正确地执行了<代码> T <代码>。如果你不是想把
Z
当作字面意思,那么不要在它前面加一个引号。如果你的意思是字面意思,就像我说的,就不要

链接

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

      我的时区中的输出:

      服务器中字符串的格式为ISO 8601。time类将最常见的ISO 8601变体解析为默认变量,也就是说,不指定任何格式化程序

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

      由于服务器时间和客户端时间表示相同的时间,因此差值始终为零:

          Duration difference = Duration.between(serverDateTime, clientDateTime);
          System.out.println(difference);
      
      以0秒的时间段读取(这也是ISO 8601格式)

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

      你的代码出了什么问题? 首先,字符串中的UTC偏移量是
      +00:00
      。一个格式模式字母
      Z
      和一个文字
      Z
      都与此不匹配。所以不要试着那样做。其次,千万不要在格式模式字符串中以单引号括起来的文字形式给出
      Z
      。当
      Z
      显示为偏移量(这是常见的)时,您需要将其解析为偏移量,而不是文本。第三,格式模式字符串中的文本需要在前面有一个引号,在后面有一个引号。您在中间正确地执行了<代码> T <代码>。如果你不是想把
      Z
      当作字面意思,那么不要在它前面加一个引号。如果你的意思是字面意思,就像我说的,就不要

      链接
      serverDateTime: 2020-04-04T07:05:57Z
      clientDateTime: 2020-04-04T09:05:57+02:00[Europe/Copenhagen]
      
          Duration difference = Duration.between(serverDateTime, clientDateTime);
          System.out.println(difference);
      
      PT0S
      
          Duration difference = Duration.between(serverDateTime, OffsetDateTime.now());
          System.out.println(difference);