java:修复日期对象中不正确的时区

scyqe7ek  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(368)

外部api返回一个带有日期的对象。
根据他们的api规范,所有的日期总是以gmt报告。
但是,生成的客户机类(我无法编辑)没有正确设置时区。相反,它使用本地时区而不将日期转换为该时区。
所以,长话短说,我有一个对象的日期,我知道是格林威治时间,但它说的是欧洲中部时间。在不更改计算机上的本地时区或执行以下操作的情况下,如何调整此错误:

LocalDateTime.ofInstant(someObject.getDate().toInstant().plus(1, ChronoUnit.HOURS),
                        ZoneId.of("CET"));

谢谢您。

xriantvc

xriantvc1#

热释光;博士⇒ 使用ZoneDateTime进行转换

public static void main(String[] args) {
    // use your date here, this is just "now"
    Date date = new Date();
    // parse it to an object that is aware of the (currently wrong) time zone
    ZonedDateTime wrongZoneZdt = ZonedDateTime.ofInstant(date.toInstant(), ZoneId.of("CET"));
    // print it to see the result
    System.out.println(wrongZoneZdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));

    // extract the information that should stay (only date and time, NOT zone or offset)
    LocalDateTime ldt = wrongZoneZdt.toLocalDateTime();
    // print it, too
    System.out.println(ldt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

    // then take the object without zone information and simply add a zone
    ZonedDateTime correctZoneZdt = ldt.atZone(ZoneId.of("GMT"));
    // print the result
    System.out.println(correctZoneZdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
}

输出:

2020-01-24T09:21:37.167+01:00[CET]
2020-01-24T09:21:37.167
2020-01-24T09:21:37.167Z[GMT]

说明:

你的方法不仅修正了区域,而且相应地调整了时间(这在需要的时候是很好的)的原因是你使用了 LocalDateTime 创建于 Instant . 一 Instant 表示时间上的一个时刻,在不同的区域中可能有不同的表示,但它保持相同的时刻。如果你创建一个 LocalDateTime 从中放入另一个区域,日期和时间将转换为目标区域的日期和时间。这不仅仅是替换区域,同时保持日期和时间不变。
如果你使用 LocalDateTimeZonedDateTime ,提取日期和时间表示形式时忽略区域,这使您能够在以后添加不同的区域并保持日期和时间不变。
编辑:如果代码与错误代码在同一个jvm中运行,那么可以使用 ZoneId.systemDefault() 以获得与错误代码使用的时区相同的时区。根据你的口味 ZoneOffset.UTC 而不是 ZoneId.of("GMT") .

mzmfm0qo

mzmfm0qo2#

恐怕你在这里绕不开一些计算。我强烈建议采用一种基于 java.time 类,但也可以使用 java.util.Calendar 类和 myCalendar.get(Calendar.ZONE_OFFSET) 对于这些计算:
https://docs.oracle.com/javase/8/docs/api/java/util/calendar.html#zone_offset

相关问题