- 此问题在此处已有答案**:
Why does GMT+8
fail to parse with pattern O
despite being copied straight out of doc?(2个答案)
java DateTimeFormatterBuilder fails on testtime [duplicate](2个答案)
昨天关门了。
我自己解决了问题,但我想知道为什么会发生这种情况。
问题是这样的:最初,一个带有时区的字符串格式的日期和时间("dd-MM-yyyy HH:mm:ss:SSSS OOO")被发送到数据库。应用程序以相同的格式接收此日期,通过Map器将此日期转换为ZonnedDateTime("dd-MM-yyyy HH:mm:ss:SSSS OOO"),然后再转换回日期和时间格式的字符串("dd-MM-yyyy HH:mm")。在Intellij IDEA中,此代码工作正常,但在Android Studio中,会弹出一个错误。通过更改将时间从数据库转换为ZonnedDateTime("dd-MM-yyyy HH:mm:ss:SSSS zzzz")时的格式,解决了此问题。
我想知道为什么会这样。
Android studio中的代码:
ZonedDateTime zonedDateTime = ZonedDateTime.parse(
"22-12-2022 15:05:49:1200 GMT+10:00",
DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss:SSSS OOOO")
);
错误:
2022-12-23 12:18:13.558 24464-24464/com.example.sendmessages E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.sendmessages, PID: 24464
java.time.format.DateTimeParseException: Text '22-12-2022 15:05:49:1200 GMT+10:00' could not be parsed: length=34; index=34
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:591)
at com.example.sendmessages.Mapping.MessageMapper.getEntityToDto(MessageMapper.java:18)
intellij IDEA中的相同代码:
ZonedDateTime zonedDateTime = ZonedDateTime.parse(
"22-12-2022 15:05:49:1200 GMT+10:00",
DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss:SSSS OOOO")
);
System.out.print(dateTimeFormatter.format(zonedDateTime));
# 22-12-2022 15:05
问题是如何解决的:
ZonedDateTime zonedDateTime = ZonedDateTime.parse(
"22-12-2022 15:05:49:1200 GMT+10:00",
DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss:SSSS zzzz")
);
# 22-12-2022 15:05
1条答案
按热度按时间insrf1ej1#
OffsetDateTime
,而不是ZonedDateTime
GMT+10:00
不是时区,它是offset-from-UTC,只是UTC本初子午线前后的小时-分钟-秒数(GMT,一般商业用途也是如此)。时区远不止如此,它是过去、现在和未来的历史,是特定地区的人们根据他们的政治家的决定而使用的偏移量。
由于您的输入包含偏移量,但不包含时区,因此应该使用
OffsetDateTime
类而不是ZonedDateTime
。java
在尝试Android之前,让我们在Java平台上运行一些代码。
使用Java 19.0.1 + 10运行时:
奇数= 2022年12月22日15时05分49.120秒+10时00分
输入2 = 2022年12月22日15:05:49:1200格林尼治标准时间+10:00
奇数2 = 2022年12月22日15时05分49.120秒+10时00分
Android Studio
虽然我不做Android的工作,我安装了 * Android Studio * 只是为了验证您的问题。JetBrains Toolbox应用程序安装版本海豚2021. 3. 1补丁1在我的MacBook Pro与M1 Pro芯片。
我使用名为 * Basic Activity * 的"Phone and Tablet"模板创建了一个项目。除了将语言从Kotlin切换为Java之外,我使用了所有默认值。在等待下载完成很长时间后,我能够执行 * Make Project *,然后运行默认模拟器。
我向
MainActivity
的onCreate
方法添加了代码:控制台上的结果为:
I/系统输出:奇数= 2022年12月22日15时05分49.120秒+10时00分
I/系统输出:输入2 = 2022年12月22日15:05:49:1200格林尼治标准时间+10:00
I/系统输出:奇数2 = 2022年12月22日15时05分49.120秒+10时00分
👉 所以我不能在使用适当的类时重现你的问题。运行正确。