在Java中,为什么LocalDateTime不根据本地时区显示时间?

在Java中,为什么LocalDateTime不根据本地时区显示时间?,java,datetime,Java,Datetime,我的代码执行此操作以显示当前日期和时间 DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM); String formattedDate = dtf.format(LocalDateTime.now()); 因为我总是使用GMT,所以我并没有注意到它总是显示使用GMT时区,这是客户在不同时区报告的。但我感到困惑,因为我认为LocalDateTime是本地datetime?LocalDa

我的代码执行此操作以显示当前日期和时间

DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
String formattedDate = dtf.format(LocalDateTime.now());

因为我总是使用GMT,所以我并没有注意到它总是显示使用GMT时区,这是客户在不同时区报告的。但我感到困惑,因为我认为LocalDateTime是本地datetime?

LocalDateTime
没有
Zone
,而是使用
ZoneDateTime

String formattedDate = dtf.format(ZonedDateTime.now());
此外,您的
DateTimeFormatter
无法显示区域,为此,您必须从以下位置使用
FormatStyle.LONG
而不是
FormatStyle.MEDIUM

没有时区的日期时间

如果希望将
LocalDateTime
与区域一起使用,可以使用
atZone()


客户正在将UTC配置为默认时区的系统上运行您的程序

您可以告诉客户更改计算机上的时区,或者至少针对您的程序,但他们可能不会这样做。运行时钟设置为UTC的计算机有很好的理由

另一个解决方案可能是将用户的首选时区添加到程序设置中,并始终如一地使用它。例如:

String userPreferredTz = "Asia/Tokyo"; // Read from user preferences or settings file

ZoneId userZoneId = ZoneId.of(userPreferredTz);
dtf.format(ZonedDateTime.now(userZoneId))
我以为LocalDateTime就是本地日期时间

这是正确的
LocalDateTime
是本地日期时间,即使用系统的默认时区,除非您使用它指定时区,例如,如果您在带有
Europe/London
时区的机器集上运行以下语句,它将以GMT显示日期时间,如果您在带有
Asia/Kolkata
时区的机器集上运行它,它将以IST(印度标准时间)显示日期时间:

但是,如果在任何计算机上运行以下语句,它将始终为您提供IST的日期和时间:

System.out.println(LocalDateTime.now(ZoneId.of("Asia/Kolkata")));
由于
LocalDateTime
LocalDate
没有区域或偏移信息,因此您希望根据需要使用
ZonedDateTime
OffsetDateTime
。下表()概述了所有日期时间类,您可以根据需要从中选择一个:


时区显示从何而来?您的日期格式化程序
dtf
是否包含时区?没有,只是更新了一个问题,时区应该在格式化程序中还是在日期时间中?因为它显示了错误的时间“我以为LocalDateTime是local dateTime”—它是!它是JVM默认时区的本地,正如文档所述,即:的javadoc从默认时区的系统时钟中获取当前日期时间。对,这只是用户配置中的一个错误,我无法硬编码时区,因为我有许多客户使用不同的时区。他们在NAS上使用docker,也许docker没有选择系统时区?我不是建议你硬编码时区。相反,我建议你让它由用户配置。这是docker的一个常见问题:它默认为UTC,你必须跳转通过一些环才能进入主机时区。但这些链接似乎表明,您可以在容器中硬编码不同的时区,或者将不同的时区作为参数传递给容器,但这超出了我的用户的能力docker是否无法自动使用主机系统的时区?
System.out.println(LocalDateTime.now());
System.out.println(LocalDateTime.now(ZoneId.of("Asia/Kolkata")));