处理Java和Angular的时区差异

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

开发位于一个位置,部署位于Web应用程序的另一个位置。在开发过程中,我使用自己的位置时区来获取并保留DB(Oracle)中的日期值。

但是在部署之后,到另一个位置的时区是完全不同的,而日期似乎在测试过程中造成了一个重大问题。

这是一个简单的应用程序,其中我使用Java作为Backend和Angular 5作为前端。数据持久性由Oracle DB完成。

我不知道如何处理这个时区差异。有没有具体的方法来处理这种差异?任何投入都是最受欢迎的。

[编辑]:因此,要求很简单 - 只要用户登录应用程序,他必须能够按照他的时区查看日期和时间。即使用户创建/修改项目,他也必须能够按照他的时区查看时间。

例如:如果我发布帖子/状态,那么我的结束时间必须显示我所在位置的时区。同样,如果我在另一个地理位置看到相同的帖子/状态,那么我必须看到该时区​​的相应时间。

java angular datetime time timezone
2个回答
2
投票

任何带时区的东西都不好玩。我的建议是确保您在服务器上将日期转换为UTC并以此方式保留它们,然后在客户端上将它们转换回来。

我不知道你是如何将日期传递给服务器的,但是类似于

Determine TimeZone from a JSON String?可能很有用。

有关更好的讨论,请参阅:

Should the Server or the Client handle timezone when sending/receiving dates?

How to properly work with Timezone?

祝好运!

编辑:

如下面Jon Skeet所述,这不一定是个好主意。没有时区的UTC转换是“有损”的。如果时区发生变化(并且它们不时发生变化),那么您的UTC时间戳不再代表它最初的意图。

查看此页面并对您的数据类型做出一些决定(如果需要,TIMESTAMP WITH TIME ZONE将保留用户输入的时区)。

https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch4datetime.htm

几乎所有关于日期/时间的事情都会充满警告,而这个问题并未提供有关应用程序存储/显示日期和时间信息的要求的大量信息。


1
投票

我猜你正在使用Java Date对象吗?如果您使用的是Java 8,则应考虑以下两点:

OffsetDateTime 在ISO-8601日历系统中与UTC / Greenwich偏移的日期时间,例如2007-12-03T10:15:30 + 01:00。

OffsetTime 在ISO-8601日历系统中与UTC / Greenwich偏移的时间,例如10:15:30 + 01:00。

https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html

如果您将它保存到Oracle并且您需要的只是DATE,那么我建议您将其保存为String并使用“YYYY-MM-DD”格式化它。

默认情况下,Java JVM始终将本地JVM TZ(TimeZone)值添加到任何日期对象。

那么让我们来看一个商业案例。如果您在美国的4个不同地区有客户,并且您需要在其本地时间内报告日期/时间事件,那么您必须在GMT时间内保存到数据库。默认情况下,本地TZ会相应地调整它。 Oracle的内置日期/时间对象默认执行此操作,就像每个主要操作系统一样。因此,创建一个DIR,注意当前时间,然后进入您的操作系统的区域设置并更改您的时区。 DIR创建日期将自动翻译。

最简单的形式是模型 - 视图 - 控制器的完美案例。 TZ变更是控制器的地方。 Model是GMT值,View被转换为当前用户的TimeZone。

我希望这可以帮助你。请使用GMT,不要过度考虑。保存到数据库不使用GMT是我的拙见。

干杯

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