java中的LocalDate存储UTC日期还是本地日期?

问题描述 投票:0回答:2

阅读Java中有关LocalDate的文档,文档中说LocalDate.now()“从默认时区的系统时钟获取当前日期。”。因此,如果我在西班牙马德里,想象一下现在是 28-09-2022 01:12(GMT+02:00)

  1. LocalDate 中存储的日期是 2022 年 9 月 28 日,而不是 UTC 日期 2022 年 9 月 27 日。对吗?

  2. 打印 LocalDate 时,不会考虑系统的时区来打印它,因为 LocalDate 没有任何时区信息,只是打印存储的值,对吗?。

  3. 那么,与 Date 对象存在差异,因为 Date 对象存储 UTC 日期和时间,对吗?

  4. 文档说“这个类不存储或表示日期或时区”,所以为了进行下一步,如果 localDate 没有时区信息,如何完成第二句?

        LocalDate localDate = LocalDate.now();
    
        ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.of("EST5EDT"));
    
        System.out.println(zonedDateTime);
    
java date utc localdate
2个回答
2
投票

Jesper 已经回答了您的所有问题。然而,他对你的 Q#2 的理解似乎与你的想法不同。您的问题#2 是:

当您打印 LocalDate 时,它不被视为所在时区 系统打印它,因为 LocalDate 没有任何时区 信息,只打印存储的值,对吧?.

事实是,当您打印

LocalDate
时,它总是考虑系统的时区,例如如果你同时在马德里、印度和纽约打印
LocalDate.now()
,你可能会得到不同的结果(取决于你在什么时间打印)。或许,这就是 Ole V.V.试图在他的评论中告诉你。

演示

import java.time.LocalDate;
import java.time.ZoneId;

public class Main {
    public static void main(String[] args) {
        System.out.println(LocalDate.now(ZoneId.of("Europe/Madrid")));
        System.out.println(LocalDate.now(ZoneId.of("Asia/Kolkata")));
        System.out.println(LocalDate.now(ZoneId.of("America/New_York")));
    }
}

输出

2022-09-28
2022-09-29
2022-09-28

要理解这种差异,我建议您打印

LocalDateTime
而不是仅打印
LocalDate
,例如

import java.time.LocalDateTime;
import java.time.ZoneId;

public class Main {
    public static void main(String[] args) {
        System.out.println(LocalDateTime.now(ZoneId.of("Europe/Madrid")));
        System.out.println(LocalDateTime.now(ZoneId.of("Asia/Kolkata")));
        System.out.println(LocalDateTime.now(ZoneId.of("America/New_York")));
    }
}

输出

2022-09-28T21:03:56.438167
2022-09-29T00:33:56.443577
2022-09-28T15:03:56.444049

0
投票

我认为第四个问题没有得到很好的回答。我认为这对 Jasper 和其他人来说是显而易见的,但对我来说并不那么明显,我认为 OP。

LocalDateTime.now() 将使用系统时钟或提供的时区来确定“现在”是什么,但随后会删除时区引用。无法确定创建 LocalDateTime 使用的原始时区

这让我想知道如果没有时区参考点可以转换,LocalDateTime.atZone(ZoneId.of("Europe/Madrid")) 如何正确地将 LocalDateTime 转换为欧洲/马德里时区?例如,如果 LocalDateTime 是 2022-09-28T21:03:56。当它不了解它所保存的日期/时间源自哪个时区时,如何将其转换为欧洲/马德里?

现在解决方案很明显了。它不会转换,也不会尝试找出它源自哪个时区。它只是将指定的时区附加到其具有的日期/时间。因此,如果 LocalDateTime 为 2022-09-28T21:03:56,则 LocalDateTime.atZone(ZoneId.of("Europe/Madrid")) 输出类似于 2022-09-28T21:03:56+01:00 的内容。请注意,除了添加 +01:00 时区偏移量之外,没有任何更改。

当我理解了这两点之后,我就非常清楚它是如何工作的了。

希望这可以帮助其他人,这对于其他人来说并不那么明显。

© www.soinside.com 2019 - 2024. All rights reserved.