对于Web应用程序,开发在一个地方,而部署在另一个地方。 在开发期间,我使用自己的位置时区来获取日期值并将其持久化在DB(Oracle)中。
但是在部署之后,到另一个位置的时区是完全不同的,日期似乎是测试过程中的主要问题。
这是一个简单的应用程序,其中我将Java用于后端,将Angular 5用于前端。数据持久化是通过Oracle DB完成的。
我不确定如何处理该时区差异。有什么具体方法可以解决这种差异?任何输入都是最欢迎的。
[EDIT] :因此,要求很简单-无论用户在哪里登录应用程序,他都必须能够按照其时区查看日期和时间。即使用户创建/修改项目,他也必须能够按照其时区查看时间。
例如::如果我要发布帖子/状态,则结束时间必须显示我所在位置的时区。同样,如果我在其他地理位置看到相同的帖子/状态,那么我必须查看该时区的相应时间。
答案 0 :(得分: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 :(得分:1)
我猜您在使用Java Date对象正确吗?如果您使用的是Java 8,则应考虑以下两项:
OffsetDateTime
在ISO-8601日历系统中,日期与UTC /格林威治时间偏移,例如2007-12-03T10:15:30 + 01:00。
OffsetTime
在ISO-8601日历系统中与UTC /格林威治时间偏移的时间,例如10:15:30 + 01:00。
https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
如果将其保存到Oracle中,而您只需要一个DATE,那么我建议您将其保存为字符串并使用“ YYYY-MM-DD”对其进行格式化。
默认情况下,Java JVM始终将本地JVM TZ(TimeZone)值添加到任何日期对象。
因此,让我们看一个业务案例。如果您有美国4个不同地区的客户,并且需要在当地时间报告日期/时间事件,则必须以格林尼治标准时间保存到数据库中。默认情况下,本地TZ将对此进行调整。 Oracle内置的Date / Time对象默认情况下会像每个主要操作系统一样执行此操作。因此,创建一个DIR,注意当前时间,然后进入操作系统的区域设置并更改时区。 DIR创建日期将自动翻译。
最简单的形式是Model-View-Controller的完美案例。 TZ变化的地方是控制器。 “模型”是GMT值,“视图”将转换为当前用户的TimeZone。
希望这对您有所帮助。请使用GMT,不要过度考虑。以我的拙见,保存到不使用GMT的DB会带来麻烦。
欢呼