我正在试着检查这个日期是否已超过一天。
当它解析字符串时,我得到了这些errosr。
java.lang.IllegalArgumentException: Pattern ends with an incomplete string literal: uuuu-MM-dd'T'HH:mm:ss'Zorg.threeten.bp.format.DateTimeParseException: Text '2020-04-04T07:05:57+00:00' could not be parsed, unparsed text found at index 19我的数据示例如下:
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他们都不管用..。正确的方法是什么?
发布于 2020-05-05 14:20:07
您不需要任何显式格式化程序。在Java中(因为它是我可以编写的):
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在这里很好。
由于服务器和客户端时间表示相同的时间,所以差异总是为零:
Duration difference = Duration.between(serverDateTime, clientDateTime);
System.out.println(difference);PT0S
阅读时间为0秒(这也是ISO 8601格式)。
如果您想知道当前时间和服务器时间之间的差异,请使用now()
Duration difference = Duration.between(serverDateTime, OffsetDateTime.now());
System.out.println(difference);你的代码出了什么问题?
首先,字符串中的UTC偏移量是+00:00。任何一种格式模式字母Z或文字Z都不会与此相匹配。所以别那么做。其次,不要将Z作为单引号以格式模式字符串括起来的文字形式提供。当Z显示为偏移量(这是常见的)时,需要将其解析为偏移量,而不是文字。第三,格式模式字符串中的文字文本需要在它之前有一个单引号,在它后面有一个单引号。您正在为中间的T正确地执行此操作。如果你不是想让Z成为一个字面意思,那就不要在它之前加上一个单引号。如果你的意思是字面意思-就像我说的,不要。
链接
https://stackoverflow.com/questions/61588271
复制相似问题