在Android studio中将时间从字符串转换为ZonedDateTime时出现问题[重复]

c0vxltue  于 2022-12-25  发布在  Android
关注(0)|答案(1)|浏览(156)
    • 此问题在此处已有答案**:

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
insrf1ej

insrf1ej1#

OffsetDateTime,而不是ZonedDateTime

GMT+10:00不是时区,它是offset-from-UTC,只是UTC本初子午线前后的小时-分钟-秒数(GMT,一般商业用途也是如此)。
时区远不止如此,它是过去、现在和未来的历史,是特定地区的人们根据他们的政治家的决定而使用的偏移量。
由于您的输入包含偏移量,但不包含时区,因此应该使用OffsetDateTime类而不是ZonedDateTime

java

在尝试Android之前,让我们在Java平台上运行一些代码。

String input = "22-12-2022 15:05:49:1200 GMT+10:00";
DateTimeFormatter f = null;
f = DateTimeFormatter.ofPattern( "dd-MM-yyyy HH:mm:ss:SSSS OOOO" );
OffsetDateTime odt = OffsetDateTime.parse( input , f );
System.out.println( "odt = " + odt );
String input2 = odt.format( f );
OffsetDateTime odt2 = OffsetDateTime.parse( input2 , f );
System.out.println( "input2 = " + input2 );
System.out.println( "odt2 = " + odt2 );

使用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 *,然后运行默认模拟器。
我向MainActivityonCreate方法添加了代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String input = "22-12-2022 15:05:49:1200 GMT+10:00";
    DateTimeFormatter f = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        f = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss:SSSS OOOO");
        OffsetDateTime odt = OffsetDateTime.parse(input, f);
        System.out.println("odt = " + odt);
        String input2 = odt.format(f);
        OffsetDateTime odt2 = OffsetDateTime.parse(input2, f);
        System.out.println("input2 = " + input2);
        System.out.println("odt2 = " + odt2);
    }
…

控制台上的结果为:
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分
👉 所以我不能在使用适当的类时重现你的问题。运行正确。

相关问题