阅读Java中有关LocalDate的文档,文档中说LocalDate.now()“从默认时区的系统时钟获取当前日期。”。因此,如果我在西班牙马德里,想象一下现在是 28-09-2022 01:12(GMT+02:00)
LocalDate 中存储的日期是 2022 年 9 月 28 日,而不是 UTC 日期 2022 年 9 月 27 日。对吗?
打印 LocalDate 时,不会考虑系统的时区来打印它,因为 LocalDate 没有任何时区信息,只是打印存储的值,对吗?。
那么,与 Date 对象存在差异,因为 Date 对象存储 UTC 日期和时间,对吗?
文档说“这个类不存储或表示日期或时区”,所以为了进行下一步,如果 localDate 没有时区信息,如何完成第二句?
LocalDate localDate = LocalDate.now();
ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.of("EST5EDT"));
System.out.println(zonedDateTime);
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
我认为第四个问题没有得到很好的回答。我认为这对 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 时区偏移量之外,没有任何更改。
当我理解了这两点之后,我就非常清楚它是如何工作的了。
希望这可以帮助其他人,这对于其他人来说并不那么明显。