开发多个时区网站时遇到麻烦。
目前,经过一些研究,我将时间存储在UTC上,并且在大多数情况下都可以正常工作。
但是有一种情况我找不到解决方案:
在两个国家(美国)有两种用户 和泰国。
泰国的用户是工人(A)。
在美国的用户是经理(B)。
当A开始工作时,他们的活动将登录到我们的系统中,而B 可以通过Web应用程序上的监控屏幕观看这些内容,他们可以选择 日期。
示例用户A在6月23日上午8点开始使用移动设备工作 应用程序,当B在监视屏幕上选择 6月23日日期时, 可以看到用户在 6月23日在泰国进行的活动(因为结果是通过UTC时间查询的),但是 问题是他应该在6月22日看到活动,而不是6月23日 6月,因为泰国的时间比美国快12 小时。
当用户A选择日期 6月22日时,我如何向用户B显示活动?
答案 0 :(得分:1)
此答案特定于MySQL。
如果您想让B
看到A's
时钟所说的话,请使用DATETIME
;会说8AM。
如果您希望B
在深夜看到A
登录,请使用TIMESTAMP
。
(这延伸到A与B,以及日期和时钟。)
每年两次,DATETIME
在凌晨2点至凌晨3点之间会出现打h。如果在标准时间和夏令时之间进行切换。
答案 1 :(得分:1)
您没有询问任何特定的技术堆栈或实现,因此我只能从一般角度进行回答。
值得理解的概念:
泰国有一个时区,全年偏移UTC + 7。
美国有多个时区,其偏移范围从UTC-10到UTC-4,具体取决于您所指的国家是哪个地区,以及是否夏令时是否有效,以及特定位置是否遵守夏令时。 (美国大部分地区都在,但夏威夷州和亚利桑那州的大部分都没有。)
“日期”只是日历上的年,月和日,但是观察日期的时间因观察者的时区而异。 everytimezone.com对此有很好的可视化效果。
根据您的情况,您将必须根据应用程序的特定需求来决定所需的行为:
您是否希望显示的期间代表选择日期的人所观察到的所有活动?如果是这样,则在选择日期的人的本地时区中确定当前日期的开始和下一个日期的开始。将它们转换为UTC,并查询该UTC时间范围内的所有事件。
示例:
Example Activity Time: 2018-06-23T18:00:00+07:00 (Asia/Bangkok)
Stored as UTC: 2018-06-23T11:00:00Z
Date Selected: 2018-06-23 (America/New_York)
Local Range: [2018-06-23T00:00:00-04:00 , 2018-06-24T00:00:00-04:00 )
UTC Range: [2018-06-23T04:00:00Z , 2018-06-24T04:00:00Z )
Query: ... where ActivityUTC >= '2018-06-23 04:00:00' and ActivityUTC < '2018-06-24 04:00:00'
或者,您是否希望所选日期始终在记录该活动的人所在的时区中代表活动的日期,而不考虑观看者所在的时区?如果是这样,则将该本地日期存储在单独的仅日期的列中,并在不考虑时区的情况下对其进行查询。
示例:
Example Activity Time: 2018-06-23T18:00:00+07:00 (Asia/Bangkok)
Local Date Stored: 2018-06-23
Date Selected: 2018-06-23
Query: ... where ActivityLocalDate = '2018-06-23'
注意,您仍可以将UTC日期和时间存储在其他字段中,但与该特定查询无关。
根据时间和出勤行业的先前经验,我可以说,如果是我,我会想要第二种选择-因为工人通常是根据自己的时区而不是经理的时区来支付工资的。但是,它们的确是边缘案例,您必须自己决定哪种方法最适合您的业务需求。