开发位于一个地方,部署在另一个位置进行Web application。在开发过程中,我使用自己的位置时区来获取并持续DB(Oracle)中的日期值。
但是部署后,到另一个位置时区完全不同,日期似乎在测试过程中引起了一个重大问题。
这是一个简单的应用程序,其中我将Java用于后端,而Angular 5用于前端。数据持续使用是使用Oracle DB完成的。
我不确定如何处理这个时区差异。是否有任何特定方法来处理这种差异?最欢迎任何输入。
[edit]:因此,要求很简单 - 无论用户在应用程序中登录何处,他都必须能够按照他的时区查看日期和时间。即使用户创建/修改项目,他也必须能够按照他的时区查看时间。
对于ex:,如果我要发布帖子/状态,那么我的时间必须显示我位置的时区。同样,如果我在另一个地理位置上看到相同的帖子/状态,那么我必须看到与该时区的时间。
与时区的任何东西都不有趣。我的建议是确保您将日期转换为服务器上的UTC并以这种方式持续使用,然后将它们转换回客户端。
我不知道您是如何将日期传递给服务器的,但是
之类的东西从JSON字符串确定时区?可能有用。
有关更好的讨论,请参见:
发送/接收日期时服务器或客户端应处理时区?
如何与时区正确使用?
祝你好运!
编辑:
正如下面的乔恩·斯基特(Jon Skeet)所指出的那样,这不一定是一个好主意。没有时区的不带时区的UTC转换为"有损"。如果时区域变化(并且它们不时发生),那么您的UTC时间戳将不再代表原本打算的内容。
查看此页面并就数据类型做出一些决定(如果需要的话,Timestamp与时区将保留用户输入的时区)。
https://docs.oracle.com/cd/b19306_01/server.102/b14225/ch4datetime.htm
几乎您使用日期/时代的所有事情都将充满警告,并且这个问题并没有提供很多有关该应用程序对存储/显示日期和时间信息的要求的信息。
我猜你正在使用java日期对象吗?如果您使用的是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,而您所需要的只是一个日期,那么我建议您将其保存为字符串,并使用" Yyyy-MM-DD"进行格式化。
默认情况下,Java JVM总是将本地JVM TZ(时区)值添加到任何日期对象。
所以让我们看一下业务案例。如果您在美国的4个不同地区有客户,并且需要在当地时间报告日期/时间事件,则必须在GMT时间内保存到DB。默认情况下,本地TZ将相应调整。Oracle的内置日期/时间对象默认情况下执行此操作,就像每个主要操作系统一样。因此,创建一个DIR,请注意当前时间,然后进入您的操作系统区域设置并更改时区。Dir Creation日期将自动翻译。
最简单的形式这是模型视图控制器的完美案例。TZ更改是控制器。该模型是GMT值,视图转化为当前用户的时区。
我希望这对您有帮助。请使用GMT,不要过度思考。在我的拙见中保存到不使用GMT的DB是要求麻烦的。
欢呼