将字符串转换为ZonedDateTime

问题描述 投票:-1回答:2

我需要将字符串2020-04-15T23:00:00 + 0000转换为ZonedDateTime。我尝试了以下方法,但它们没有起作用:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss Z");
System.out.println(ZonedDateTime.parse("2020-04-15T23:00:00+0000", formatter));

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss 00:00");
System.out.println(ZonedDateTime.parse("2020-04-15T23:00:00+0000", formatter));

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss 0000");
System.out.println(ZonedDateTime.parse("2020-04-15T23:00:00+0000", formatter));

我也使用了ISO_LOCAL_DATE_TIME,但这没用。有什么想法吗?

更新:

我在下面尝试过:

    OffsetDateTime dateTime1 = OffsetDateTime.parse("2020-04-15T23:00:00+0000",
            DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"));
    System.out.println(dateTime1.toZonedDateTime());

我得到的输出为2020-04-15T23:00Z,但我需要它为2020-04-15T23:00:00Z,并在结尾处加上秒数,这是微调。

java datetime-format zoneddatetime
2个回答
0
投票

您可以像以下进行转换,它支持以下所有输入格式

"2012-10-01T19:30:00+0200"
"2012-10-01T19:30:00+02" 
"2012-10-01T19:30:00+02:00"
"2012-10-01T19:30:00Z" 

代码段

        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[XXX][XX][X]");


        OffsetDateTime osdt1 = OffsetDateTime.parse("2020-04-15T23:00:01+0000", dtf1);
        OffsetDateTime osdt2 = OffsetDateTime.parse("2020-04-15T23:00:43+0900", dtf1);
        OffsetDateTime osdt3 = OffsetDateTime.parse("2020-04-15T23:00:00+0000", dtf1);
        OffsetDateTime osdt4 = OffsetDateTime.parse("2020-04-15T23:00:00+0900", dtf1);
        System.out.println("2020-04-15T23:00:01+0000 --> " + osdt1.toString());
        System.out.println("2020-04-15T23:00:43+0900 --> " + osdt2.toString());
        System.out.println("2020-04-15T23:00:00+0000 --> " + osdt3.toString());
        System.out.println("2020-04-15T23:00:00+0900 --> " + osdt4.toString());

        System.out.println("\n");

        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
        System.out.println("2020-04-15T23:00:01+0000 --> " + dtf2.format(osdt1));
        System.out.println("2020-04-15T23:00:43+0900 --> " + dtf2.format(osdt2));
        System.out.println("2020-04-15T23:00:00+0000 --> " + dtf2.format(osdt3));
        System.out.println("2020-04-15T23:00:00+0900 --> " + dtf2.format(osdt4));

以上作品的输出

2020-04-15T23:00:01+0000 --> 2020-04-15T23:00:01Z
2020-04-15T23:00:43+0900 --> 2020-04-15T23:00:43+09:00
2020-04-15T23:00:00+0000 --> 2020-04-15T23:00Z
2020-04-15T23:00:00+0900 --> 2020-04-15T23:00+09:00


2020-04-15T23:00:01+0000 --> 2020-04-15T23:00:01+0000
2020-04-15T23:00:43+0900 --> 2020-04-15T23:00:43+0900
2020-04-15T23:00:00+0000 --> 2020-04-15T23:00:00+0000
2020-04-15T23:00:00+0900 --> 2020-04-15T23:00:00+0900

0
投票
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
            .appendPattern("XX")
            .toFormatter();
    String str = "2020-04-15T23:00:00+0000";
    OffsetDateTime dateTime = OffsetDateTime.parse(str, formatter);
    System.out.println(dateTime);

输出:

2020-04-15T23:00Z

由于您的输入字符串包含偏移量+0000,并且没有时区,因此更希望将日期和时间表示为OffsetDateTime,而不是ZonedDateTime(如果您有特定的原因需要使用[C0 ],只需在上面的代码中使用该类,它也会起作用)。

我更喜欢使用内置的格式化程序,而不是编写自己的格式模式字符串。仅对于偏移量,我使用的是格式模式ZonedDateTime(其他模式也可以使用)。

我得到的输出为2020-04-15T23:00Z,但我需要2020-04-15T23:00:00Z,这是秒的末尾修剪。

您很可能不会。格式为ISO 8601,在ISO 8601中,秒为0时是可选的。XXOffsetDateTime具有全精度(甚至是纳秒级)。截断仅在对象的ZonedDateTime方法产生的输出中发生。如果某些其他API或其他系统需要ISO 8601格式,则不带秒的变体也应该起作用。

如果确实需要特定格式,请使用第二个toString格式化为该所需格式的字符串。

链接

DateTimeFormatter

© www.soinside.com 2019 - 2024. All rights reserved.