2009-06-19 80 views
0

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

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

回答

1

天儿真好,

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

编辑: ...和两个机器上的MySQL时区是相同的?

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

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

顺便说一句你不应该使用TIMESTAMP类型来存储UTC_TIMESTAMP而不是DATETIME类型吗?

更新:从存储时间解耦演示时间绝对是一种方式。然后,您可以在全球范围内重复使用相同的数据,并且只需在将数据呈现给用户时在本地时间进行转换。

如果你不这样做,那么你将不得不关闭存储时区的时间戳是何时,然后进入各种具有复杂的排列,如果

  • 地方摸出时区存储在夏令时中,
  • 数据存储时的时区与数据的存储时区之间有什么区别。

让所有存储为UTC的地方摆脱了这一点。

如果大多数用户不得不根据UTC时间自己计算出本地时间,那么系统通常会将其转换为用户当前的本地时间,这样他们就不会很高兴。

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

HTH

欢呼声,

+0

一个设置为utc时间,另一个设置为UTC + 2,因为一台机器在伦敦,另一台机器在德国。我总是希望将区域设置的时区设置为时区,因为那就是其他人建议http://serverfault.com/questions/14685/local-timezones-on-servers-considered-harmful – Thomaschaaf 2009-06-19 13:35:54

0

您是否尝试过这样做呢?

一起执行此说明。

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

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