当前位置: 首页 > 知识库问答 >
问题:

在EST vs UTC中运行的服务器中的LocalDate和LocalDateTime

阮星火
2023-03-14

我试图理解LocalDate和LocalDateTime。由于它们不携带区域信息,现在如何工作()在两个不同的时区。

例子:

服务器1(EST时区):

LocalDateTime。现在()-

服务器2(UTC时区):

LocalDateTime。现在()-

此外,如果我将下面的日期字符串转换为LocalDateTime,然后转换为LocalDate,结果会是什么?

2020-04-06T23:00:00.000

共有2个答案

许振海
2023-03-14
    ZoneId easternTime = ZoneId.of("America/Montreal");
    System.out.println(LocalDateTime.now(easternTime));
    System.out.println(LocalDateTime.now(ZoneOffset.UTC));
    System.out.println(LocalDate.now(easternTime));
    System.out.println(LocalDate.now(ZoneOffset.UTC));

刚才运行时的输出:

2020-04-06T09:56:17.381558
2020-04-06T13:56:17.385215
2020-04-06
2020-04-06

虽然您可以正确地看到,LocalDateTime和LocalDate不包含任何时区信息,但它们的方法现在确实使用时区。要么是传递给他们的,要么是使用no-arg变量,即JVM的默认时区。

您还问:

此外,如果我将下面的日期字符串转换为LocalDateTime,然后转换为LocalDate,结果会是什么?

2020-04-06T23:00:00.000

为什么不也试试呢?

    LocalDateTime ldt = LocalDateTime.parse("2020-04-06T23:00:00.000");
    System.out.println(ldt);
    LocalDate ld = ldt.toLocalDate();
    System.out.println(ld);
2020-04-06T23:00
2020-04-06

LocalDateTime转换为LocalDate不涉及任何时区(或UTC偏移量)。时间部分被简单地丢弃,日期部分保持不变。

司马作人
2023-03-14

2020年4月6日,北美东海岸的大多数时区如America/蒙特利尔America/New_York使用UTC后四小时的偏移量。

因此,在这些区域,2020-04-06的晚上11点同时是UTC的7日凌晨3点。将四个小时添加到2020-04-06T23:00以获得2020-04-07T03:00。添加四个小时将我们从America/Port-au-PrinceAmerica/Nassau中使用的挂钟时间带到UTC。

上述时区使用的偏移量仅比UTC晚了半年四小时。这些地区的政界人士决定在大约半年的时间里实行夏令时(DST)。因此,一年中有半年的时间,他们会将时钟提前一个小时,以偏离UTC的04:00,而一年中的晚些时候,他们会将时钟从UTC的05:00后退一个小时。例如,今年早些时候,美国/纽约的晚上11点将是UTC的04:00,而不是4月的03:00。

1月份的标准时间比UTC晚5小时。所以,晚上11点加上5个小时就是第二天早上4点。

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ZonedDateTime.of( 2020 , 1 , 6 , 23 , 0 , 0 , 0 , zNewYork ) ; 
Instant instant = zdt.toInstant() ;  // 2020-01-07T04:00Z

四月的夏令时比UTC晚四个小时。所以,晚上11点加上四个小时就是第二天凌晨3点。

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ZonedDateTime.of( 2020 , 4 , 6 , 23 , 0 , 0 , 0 , zNewYork ) ; 
Instant instant = zdt.toInstant() ;  // 2020-04-07T03:00Z

顺便说一句,夏令时只是政客们改变其管辖范围内时区使用的偏移量的众多原因之一。世界各地的政客们都表现出惊人地频繁地改变偏移量的倾向。您的编程应该始终期望时区改变其偏移量。仅仅因为您的特定关注区域目前没有遵守夏令时并不意味着偏移量永远不会改变。

至于解析2020-04-06T23:00:00.000作为LocalDateTime,您将获得2020-04-06T23:00:00.000。忽略时区是LocalDateTime的全部重点。因此不进行任何调整。

您可能认为LocalDateTime代表特定的位置。但是,不,它代表任何地方或所有地方。但从来没有任何特定的地方。对于特定的位置,请使用ZonedDateTime

另一点:EST不是时区。这种2-4个字母的代码不是实时时区,不是标准化的,甚至不是唯一的。例如,EST是指澳大利亚东部标准时间还是北美东部标准时间?是中央标准时间还是中国标准时间?在日期时间处理中避免这些伪区域。

您碰巧使用了错误的伪代码。2020年4月6日,大多数东海岸时区都在遵守夏令时(DST)。因此,他们将被视为“EDT”而不是“EST”。通过指定实时时区名称来避免此问题。

实时时区使用大陆/地区格式命名。有关实时时区列表,请参见维基百科。

当您调用LocalDateTime时。现在,JVM的当前默认时区被隐式地用于捕获该区域内的人看到的当前时间。然后删除时区的事实。

这:

LocalDateTime.now() 

…与此相同:

LocalDateDate.now( ZoneId.systemDefault() )

...这与获取在特定时区中看到的当前时刻相同,然后删除时区信息:

ZonedDateTime.now( ZoneId.systemDefault() ).toLocalDateTime()

有关演示LocalDateTime的更多代码示例。现在,请参见Ole V.V.的正确答案。

如果LocalDateTime不适合获取当前时刻,也不适合跟踪任何时刻,那么该类的适当用途是什么?三件事:代表任何地方,代表所有地方,预约未来的约会。

  • 任何一个地方都有点像圣诞节开始的时候。今年的圣诞节从2020-12-25T00:00开始,无论你身在何处。当然,这意味着圣诞节首先在基里巴斯午夜后开始,然后在日本午夜后开始,甚至在突尼斯午夜后开始,然后在芝加哥午夜后开始

设置约会。

LocalDateTime appointment = LocalDateTime.of( 2021 , 1 , 23 , 15 , 0 , 0 , 0 ) ;

确定制作日历的时刻。每次这样做,如果政客改变了这个时区的规则,你可能会得到不同的结果。

ZoneId z = ZoneId.of ( "America/Panama" ) ;
ZonedDateTime dueToArrive = appointment.atZone( z ) ;

至于LocalDate,我们在上面的示例中看到日期取决于时区。对于任何给定时刻,日期因时区而异。在日本东京可能是“明天”,而在加拿大魁北克蒙特利尔仍然是“昨天”。

因此,在询问当前日期时,必须指定时区。

LocalDate ld = LocalDate.now( ZoneId.of( "Asia/Kolkata" ) ) ;

如果省略时区,则会隐式应用JVM当前的默认时区。所以本地日期。现在()变为本地日期。现在(ZoneId.systemDefault())。我建议显式指定所需/预期的区域,而不是依赖于隐式默认值。

你说:

在EST与UTC中运行的服务器

仅供参考,服务器通常应该设置为UTC。您的大部分思考、编程、日志记录等都应该在UTC中完成。学会将UTC视为唯一的真实时间,除了变化之外,还有所有其他区域。

作为程序员,您永远不应该依赖默认时区。这远远超出了您的控制范围。用户或系统管理员可以很容易地更改该默认值。此外,JVM中任何应用程序的任何线程中的任何代码都可以通过调用TimeZone.setDefault立即更改JVM的当前默认时间。因此,即使在应用程序执行期间,默认值也可以随时更改。

 类似资料:
  • ` ` 在TOmCAT服务器中。我无法运行这个项目。? ` 严重:web应用程序[/SpringMvc4]中的Servlet[spring]抛出了load()异常Java。伊奥。FileNotFoundException:无法打开组织上的ServletContext资源[/WEB-INF/spring servlet.xml]。springframework。网状物上下文支持ServletCont

  • 我有一个php docker容器,我的Symfony项目在哪里。 这是我的docker-compose.yml 我想使用以下命令启动我的symfony项目: 但当我想访问url时,它不起作用。我收到以下错误消息: localhost页不行 localhost未发送任何数据。 我该怎么解决这个问题? PS:我用docker for mac 和输出: [2016-08-06 14:09:53]php.

  • 问题内容: 我正在设置一个简单的图像:包含Riak(一个NoSQL数据库)的图像。该映像以CMD形式启动Riak服务。现在,如果我使用将该程序作为守护程序运行,它将启动Riak进程(我可以在日志中看到它)。但是,它会在几秒钟后自动关闭。如果我使用riak进程未启动运行它(更新:对此的解释,请参见答案)。实际上,根本没有任何服务在运行。我可以使用终端手动启动它,但是我希望Riak自动启动。我认为其他

  • 本文向大家介绍在Apache服务器中运行CGI程序的方法,包括了在Apache服务器中运行CGI程序的方法的使用技巧和注意事项,需要的朋友参考一下 关于apache与CGI在这里就不解释了. 1、apache下载地址:http://www.apache.org,下面以2.0.63为例介绍运行CGI程序的配置。 2、下载Windows下的Perl解释器ActivePerl,官方网站:http://w

  • 问题内容: 我想使用Docker部署我的rails项目。因此,我使用Docker-Compose。但是我收到一个奇怪的错误消息。当运行docker-compose up(包含db-container和postgresql,redis和带有rails的Web容器)时,我得到一个 rails server -h 所以我不明白为什么会收到此消息,因为每次运行docker- compose时,都会启动新容