【问题标题】:Convert a string to ZonedDateTime将字符串转换为 ZonedDateTime
【发布时间】:2025-11-26 18:55:02
【问题描述】:

我需要将字符串 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 的最后几秒,这是修剪。

【问题讨论】:

  • @Dwhitz 不。
  • 您的模式在秒和时区之间有一个空格,而实际值在那里没有空格。如果您想以特定模式打印ZonedDateTime,您应该使用具有该模式的格式化程序来格式化它(例如formatter.format(dateTime1)ZonedDateTime 本身没有模式(当您调用@时它使用默认格式) 987654327@)
  • @MarkRotteveel 你能看看我在问题中的更新吗?我删除了空间,它确实有效,但它从最后剥​​离了几秒钟。
  • 我评论的第二部分解决了这个问题。当您使用System.out.println(..) 时,它使用toString(),它始终使用相同的格式化程序来生成日期的字符串表示,并且在该格式化程序中,秒是可选的。如果您想使用不同的格式(例如,秒不是可选的格式),您需要明确使用格式化程序(例如 System.out.println(formatter.format(dateTime1))

标签: java datetime-format zoneddatetime


【解决方案1】:
    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(如果您有需要@ 987654327@,只需在上面的代码中使用该类,它也可以工作。

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

我得到的输出是 2020-04-15T23:00Z 但我需要它作为 2020-04-15T23:00:00Z 最后的秒数是 修剪。

你很可能不会。格式为 ISO 8601,在 ISO 8601 中,秒为 0 时是可选的。OffsetDateTimeZonedDateTime 具有完整精度(甚至是纳秒)。遗漏(您称之为修剪)仅发生在对象的 toString 方法产生的输出中。如果您需要其他 API 或其他系统的 ISO 8601 格式,那么不带秒的变体也应该可以工作。

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

你的代码出了什么问题?

Mark Rotteveel 已经说过:ISO 8601 允许时间和 UTC 偏移之间没有空格。或者反过来说,当您在格式模式字符串中在ssZ 之间放置一个空格时,解析将需要在解析后的字符串中有一个空格。由于没有空格,解析失败。

链接

【讨论】:

    【解决方案2】:

    你可以像下面这样转换,它支持以下所有输入格式

    "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
    

    【讨论】:

      最近更新 更多