gpt4 book ai didi

Java日期字符串转换为不同格式但具有相同时区

转载 作者:行者123 更新时间:2023-12-01 16:47:08 26 4
gpt4 key购买 nike

SimpleDateFormat from = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
SimpleDateFormat to = new SimpleDateFormat("MM/dd/yyyy Z");
Date date = from.parse("2017-08-10T00:00:00.000+0000");
String newDateStr = to.format(date);

newDateStr 为08/09/2017 -0500。我希望 newDataStr 可以与原始日期字符串(0000)具有相同的时区 - 08/10/2017 -0000。我应该怎么做才能实现这个目标?

最佳答案

使用现代 Java 日期和时间 API java.time 保留原始字符串的偏移量要容易得多:

    DateTimeFormatter from = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSZ");
DateTimeFormatter to = DateTimeFormatter.ofPattern("MM/dd/yyyy Z");
String newDateStr = OffsetDateTime.parse("2017-08-10T00:00:00.000+0000", from)
.format(to);
System.out.println(newDateStr);

这会打印

08/10/2017 +0000

这并不是建议更改为现代 API 的唯一原因。您使用的 Date 类早已过时,尤其是 SimpleDateFormat 因使用起来很麻烦而闻名。我总是建议在 2018 年远离这些类。现代 API 通常更好。既然您已经在使用 Java 8,那么您绝对没有理由不想要它(对于任何阅读并使用 Java 6 或 7 的人来说,新的 API 也已向后移植到这些 Java 版本)。

出了什么问题?

老式的 Date 对象只是一个时间点,它不包含时区或偏移量。因此,在将字符串解析为 Date 后,偏移量信息不再存在。因此,Date 和新格式化程序 to 都无法知道原始字符串中的偏移量或时区。相反,新的格式化程序使用自己的时区。由于您没有在格式化程序上明确设置时区,因此它的时区是您的 JVM 的时区,显然是 2017 年 9 月这些天与 UTC 偏移量 -5 的时区。

有一些棘手的方法可以解决过时类的问题,但正如我可能已经说过的,我不想打扰。

Android 的“调用需要 API 级别 26”

@Ponomarenko Oleh 在评论中写道:

Pay attention: "Call requires API Level 26" for Android.

但是,java.time 在旧版和新版 Android 设备上都能很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。这也是评论中引用的消息的本意。
  • 在非 Android Java 6 和 7 中获取 ThreeTen Backport,即现代类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保使用子包从 org. Threeten.bp 导入日期和时间类。

链接

关于Java日期字符串转换为不同格式但具有相同时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48509538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com