2024-09-02T10:30:48.71
我在解析的响应中收到了类似这样的特定日期字符串。我想使用 Java 将其转换为。我在网上看到过一些Z
在末尾带有 present 的示例,但在本例中我收到的却没有Z
。我可以在末尾添加 present 然后执行 吗Instant.parse(date).atOffset(ZoneOffset.UTC)
?
2
最佳答案
2
不要盲目使用
请注意LocalDateTime#atOffset
只是将给定的偏移量与本地日期时间相结合,而不进行任何转换。因此,除非您给定的本地日期和时间是 UTC,否则使用 会得到错误的结果LocalDateTime#atOffset(ZoneOffset.UTC)
。
解析给定的日期时间字符串后,您应将其转换为ZonedDateTime
所需的ZoneId
,例如ZoneId
日期时间值供应商的 。随后,您可以将获得的 转换ZonedDateTime
为Instant
,然后转换为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
-
22024-09-02T10:30:48.71不是偏移日期时间值。其中没有偏移信息。这是一个本地日期时间值
–
-
2如果你的供应商与你处于同一时区(这是使用这种不精确格式的唯一合理理由),那么正确的表述应该是
OffsetDateTime odt = ldt.atZone(ZoneId.systemDefault()).toOffsetDateTime();
–
-
2如果字符串位于 UTC 以外的其他时区(例如发送方或接收方的本地时区),则将给出错误的结果。
–
|
–
–
|