MySQL和国际日期

时间:2009-06-19 13:22:13

标签: mysql utc unix-timestamp

假设我在多个位置有多个服务器,并且我想使用MySQL的日期时间类型作为字段日期,我总是希望字段日期具有UTC时间戳,所以当我添加它时我会执行UTC_TIMESTAMP()到数据库。现在说我想让MySQL输出UNIX TIMESTAMP。

当我在服务器A上执行此操作时,我得到字符串“2009-06-17 12:00:00”,在它上面执行UNIX_TIMESTAMP(STRING)给我的号码1245240000。这是2009-06-17 12:00:00在UTC时间。现在我在服务器B上做同样的事情。 我从UTC字符串返回相同的字符串但是当再次执行UNIX_TIMESTAMP(STRING)时,我返回错误的数字1245232800,这是UTC +2时间。我该如何解决这个问题?我应该在PHP端进行从字符串到时间戳的转换吗?

2 个答案:

答案 0 :(得分:1)

天儿真好,

我会问这里显而易见的,你在两台机器上检查日期和时间吗?

编辑: ...两台机器的MySQL时区相同?

更新:好的。问题在于,传递到UNIX_TIMESTAMP的时间戳字符串被解释为当前时区中的值,然后转换回UTC,因为您在MEZ中,减去两个小时将其返回到UTC所以当它被转换回Unix时间字符串时,会从你的时间戳中减去7200。

因此,使用UNIX_TIMESTAMP()进行转换时所看到的变化又回到了Unix Epoch时间字符串。

BTW你不应该使用TIMESTAMP类型来存储你的UTC_TIMESTAMP而不是DATETIME类型吗?

更新:将展示时间与存储时间分离绝对是可行的方法。然后,您可以在世界各地重复使用相同的数据,只需在向用户呈现数据时转换为本地时间。

如果你不这样做那么你将不得不在制作时间戳时存储时区,然后进入各种复杂的排列,如果

  • 本地时区在存储时是夏令时,
  • 存储数据时的时区与数据显示的时区之间存在差异。

将所有存储为UTC的内容放弃了。

如果大多数用户必须根据返回的UTC时间自行计算出本地时间,那么大多数用户都不会那么开心,因此系统通常会将当前时间转换为用户的当前时间。

当然,如果用户想要以当地时间表达的数据(通常是这种情况)。我能想到的唯一一个广泛使用的系统,存储并呈现其在UTC中的数据,是用于空中交通管制和飞行计划管理的系统,它始终保持在UTC(或ZULU时间更精确)

HTH

欢呼声,

答案 1 :(得分:0)

你试过这个吗?

一起执行此说明。

SET time_zone = 'UTC';
SELECT FROM_UNIXTIME(0), UNIX_TIMESTAMP('2009-06-17 12:00:00'); 
// 1970-01-01 00:00:00        1245240000

它们只会影响客户端会话,而不会影响服务器配置。