2024-09-02T10:30:48.71我在解析的响应中收到了类似这样的特定日期字符串。我想使用 Java 将其转换为。我在网上看到过一些Z在末尾带有 present 的示例,但在本例中我收到的却没有Z。我可以在末尾添加 present 然后执行 吗Instant.parse(date).atOffset(ZoneOffset.UTC)

2

  • 3
    您期望的结果是什么?为了正确转换,您需要知道在编写字符串时隐含哪个时区。


    – 

  • 4
    您可以添加任何您想要的内容。但是您输入的预期含义是什么?您是否确定输入代表与 UTC 零小时-分钟-秒偏移的日期和时间?或者该日期和时间是否意味着表示从特定时区看到的时刻?由于您的问题没有这个重要事实,因此您的问题无法回答。


    – 



最佳答案
2

不要盲目使用

请注意LocalDateTime#atOffset只是将给定的偏移量与本地日期时间相结合,而不进行任何转换。因此,除非您给定的本地日期和时间是 UTC,否则使用 会得到错误的结果LocalDateTime#atOffset(ZoneOffset.UTC)

解析给定的日期时间字符串后,您应将其转换为ZonedDateTime所需的ZoneId,例如ZoneId日期时间值供应商的 。随后,您可以将获得的 转换ZonedDateTimeInstant,然后转换为OffsetDateTime

请注意,Z(代表祖鲁) 指的是 UTC 偏移量 +00:00。

演示:

import java.time.*;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Parse the given date-time string
        LocalDateTime ldt = LocalDateTime.parse("2024-09-02T10:30:48.71");

        // Convert ldt to ZonedDateTime for the given ZoneId
        // Replace ZoneId.systemDefault() with the desired ZoneId e.g. ZoneId.of("America/New_York")
        ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());

        // Convert zdt to Instant
        Instant instant = zdt.toInstant();
        System.out.println(instant);

        // If you want to obtain an OffsetDateTime
        OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC);
        System.out.println(odt);

        // In case you want the fraction of second only up-to two digits
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSXXX");
        System.out.println(odt.format(formatter));
    }
}

在 UTC 时间的系统/服务器上运行时输出:

2024-09-02T10:30:48.710Z
2024-09-02T10:30:48.710Z
2024-09-02T10:30:48.71Z

了解有关现代日期时间 API 的更多信息

0

我会

LocalDateTime ldt = LocalDateTime.parse("2024-09-02T10:30:48.71");
OffsetDateTime odt = ldt.atOffset(ZoneOffset.UTC);

3

  • 2
    2024-09-02T10:30:48.71不是偏移日期时间值。其中没有偏移信息。这是一个本地日期时间值


    – 


  • 2
    如果你的供应商与你处于同一时区(这是使用这种不精确格式的唯一合理理由),那么正确的表述应该是OffsetDateTime odt = ldt.atZone(ZoneId.systemDefault()).toOffsetDateTime();


    – 


  • 2
    如果字符串位于 UTC 以外的其他时区(例如发送方或接收方的本地时区),则将给出错误的结果。


    –