开发位于一个位置,部署位于Web应用程序的另一个位置。在开发过程中,我使用自己的位置时区来获取并保留DB(Oracle)中的日期值。
但是在部署之后,到另一个位置的时区是完全不同的,而日期似乎在测试过程中造成了一个重大问题。
这是一个简单的应用程序,其中我使用Java作为Backend和Angular 5作为前端。数据持久性由Oracle DB完成。
我不知道如何处理这个时区差异。有没有具体的方法来处理这种差异?任何投入都是最受欢迎的。
[编辑]:因此,要求很简单 - 只要用户登录应用程序,他必须能够按照他的时区查看日期和时间。即使用户创建/修改项目,他也必须能够按照他的时区查看时间。
例如:如果我发布帖子/状态,那么我的结束时间必须显示我所在位置的时区。同样,如果我在另一个地理位置看到相同的帖子/状态,那么我必须看到该时区的相应时间。
任何带时区的东西都不好玩。我的建议是确保您在服务器上将日期转换为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
几乎所有关于日期/时间的事情都会充满警告,而这个问题并未提供有关应用程序存储/显示日期和时间信息的要求的大量信息。
我猜你正在使用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是我的拙见。
干杯