Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中处理多个时区_Mysql_Optimization_Timezone - Fatal编程技术网

在MySQL中处理多个时区

在MySQL中处理多个时区,mysql,optimization,timezone,Mysql,Optimization,Timezone,我正在为我的应用程序使用MySQL数据库。我使用Java(带Spring)进行web开发,使用apachetomcat进行应用服务器开发。在我的应用程序中,有多个用户具有不同的时区。现在假设我正在计算用户的总登录时间。 我为必要的DDL和DML查询提供SQL FIDLE链接。我还编写了select查询,用于计算每个用户的总登录时间。由于用户名为3和4的用户尚未注销,因此我使用NOW()计算总登录时间。但是他们来自不同的时区。我将所有时间存储在MYSQL中,并使用GMT-0。那么它是否会给我错误的

我正在为我的应用程序使用MySQL数据库。我使用Java(带Spring)进行web开发,使用apachetomcat进行应用服务器开发。在我的应用程序中,有多个用户具有不同的时区。现在假设我正在计算用户的总登录时间。


我为必要的DDL和DML查询提供SQL FIDLE链接。我还编写了select查询,用于计算每个用户的总登录时间。由于用户名为3和4的用户尚未注销,因此我使用NOW()计算总登录时间。但是他们来自不同的时区。我将所有时间存储在MYSQL中,并使用GMT-0。那么它是否会给我错误的用户ID 3和4的记录时间?如果错了,解决方法是什么?

我很肯定你做得对。我确信它会给出托管MYSQL的服务器的时间。

我确信你做得很正确。我相信这会给服务器托管MYSQL的时间

那么它是否会给我错误的用户ID 3和4的记录时间?如果错误,解决方法是什么

如果您实际使用GMT+0记录值,则不会给出错误答案。无论用户的本地时间是多少,您感兴趣的只是登录和注销之间经过了多少时间

事实上,使用用户的本地时区会让这变得更加困难——你最终不得不考虑夏令时。例如,假设您在2014年10月26日记录了我的互动。我的本地登录时间可能是凌晨1:45,本地注销时间可能是凌晨1:05,这听起来很混乱——直到你意识到登录时间是夏时制生效的时候。如果您只记录UTC时间(GMT+0),您将记录00:45和01:05,留下20分钟的明显差异

基本上,当你试图记录时间点时,你可能想要记录用户的时区,这样你就可以告诉他们当时看到了什么。。。但是,您应该在UTC中记录日期/时间本身,以便于操作(例如,转换到另一个时区)。你应该很少记录当地的日期/时间;这对于经常发生的事件(例如“每周当地时间下午2点”)很有用,但对于个别时间点,这只是一个坏主意

请注意,记录UTC时间与在服务器上记录本地时间不同;您应该尝试确保服务器的时区与应用程序的行为完全无关……除此之外,这意味着如果在不同的时区中有多台服务器,则不会发生任何不好的情况。假设使用system本地时区,这可能会给出错误的答案-最好尝试使用使用UTC的函数(例如使用
UTC\u TIMESTAMP
),或者将MySQL中的“当前时区”设置为UTC。(您声称已经在GMT-0中存储日期,但如果您现在使用
NOW()的话,您不清楚您希望发生什么情况)
,除非将时区设置为UTC。)

那么,它是否会给我错误的用户ID 3和4的记录时间?如果错误,解决方案是什么

如果您实际使用GMT+0记录该值,则不会给出错误答案。无论用户的本地时间是多少,您感兴趣的只是登录和注销之间经过了多少时间

事实上,使用用户的本地时区会让这变得更加困难-你最终不得不考虑夏令时。因此,假设你在2014年10月26日记录我的互动。我的本地登录时间可能是凌晨1:45,本地注销时间可能是凌晨1:05,这听起来很混乱-直到你意识到登录时间是夏令时生效的时间。如果你只记录UTC时间(GMT+0),你会记录00:45和01:05,留下20分钟的明显差异

基本上,当您试图记录时间点时,您可能希望记录用户的时区,以便告诉他们当时看到了什么……但您应该以UTC记录日期/时间本身,以便于操作(例如转换到另一个时区)。你应该很少记录当地的日期/时间;这对于经常发生的事件(例如“每周当地时间下午2点”)很有用,但对于个别时间点,这只是一个坏主意


请注意,记录UTC时间与在服务器上记录本地时间不同;您应该尝试确保服务器的时区与应用程序的行为完全无关。。。除此之外,这意味着如果在不同的时区有多台服务器,就不会发生什么坏事。如果使用系统本地时区,则可能会给出错误的答案-最好尝试使用使用UTC的函数(例如使用
UTC\u TIMESTAMP
),或将MySQL中的“当前时区”设置为UTC。(您声称已经将日期存储在GMT-0中,但如果您现在使用
NOW()
,则不清楚您预期会发生什么情况,除非您将时区设置为UTC。)

由于DST发生变化,使用服务器的本地时间是一个坏主意,而且您可能希望在不同的时区中有多台服务器。OP声称使用GMT-0存储时间,但很难看出这与使用
NOW()
的方式是否相符。由于DST发生了变化,使用服务器的本地时间是一个坏主意,而且您可能希望在不同的时区中有多台服务器。OP声称使用GMT-0存储时间,但很难看出这与使用
NOW()
.Hi@Jon Skeet.有什么关系。。谢谢您的快速回答,但如果使用系统的本地时区(可能与GMT-0不同),我应该使用NOW()吗?如果没有,我如何计算时间?不可能?@VishalZanzrukia:根据我的回答,我建议使用
UTC\u时间