2013-10-16 67 views
3

我運行下面的MySQL查詢:MySQL的映射多個datetime值相同的Unix紀元時間

select unix_timestamp('2011-03-13 02:00:13'), unix_timestamp('2011-03-13 02:20:41'), unix_timestamp('2011-03-13 02:40:10'); 

,並得到以下奇怪的結果:

1300003200, 1300003200, 1300003200 

我覺得有某種夏令時時間在這裏,儘管所有的價值都是神奇的一樣,但這似乎很奇怪。

我很感謝如何防止MySQL在這裏做夏令時事情的建議,以及爲什麼所有結果都一樣的一些解釋。

+0

你從SELECT @@ TIME_ZONE,@@ SYSTEM_TIME_ZONE得到了什麼值? –

+0

@@ TIME_ZONE = SYSTEM,@@ SYSTEM_TIME_ZONE = CDT – Richard

回答

2

如果您的服務器的時區「CDT」遵守DST,並且您沒有將會話時區設置爲不同,MySQL的行爲是正確的。

UNIX_TIMESTAMP()函數使用會話的時區來表示您給它的值。

服務器將日期解釋爲當前時區中的值並將其轉換爲UTC的內部值。

...

注:如果您使用UNIX_TIMESTAMP()FROM_UNIXTIME()TIMESTAMP值和Unix時間戳值之間進行轉換,轉換損耗,因爲映射不是一個對一個在兩個方向上。例如,由於本地時區更改的約定,兩個UNIX_TIMESTAMP()可能會將兩個TIMESTAMP值映射到相同的Unix時間戳值。 FROM_UNIXTIME()會將該值映射回原始TIMESTAMP值中的一個。

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

有問題的時間戳在您的時區是不存在的,所以服務器是給你最準確的可能的答案......這是時鐘向前移動在UTC時間在時間前進的時候,在您的日期時間文字之前不到一個小時,這表示您的時區中「當天從未存在的時間」。

如果這些時間戳旨在成爲您當地時區的時間,那麼答案就是那些是無效值,因爲那段時間從來沒有發生過。另一方面,如果實際上假設這些時間戳已經是UTC,那麼您在任何查詢中都沒有從UNIX_TIMESTAMP()得到正確的答案,因爲時間正在從「時間」轉換爲實際未表達的時間in。

如果你SET @@TIME_ZONE = 'UTC';並重複查詢,你會明白我的意思,因爲UTC沒有DST。這個陳述只會設置你的會話的時區,而不是整個服務器。

如果運行SET @@TIME_ZONE = 'UTC';會給出錯誤消息,例如ERROR 1298 (HY000): Unknown or incorrect time zone: 'UTC',那麼很可能是您沒有使用時區信息填充MySQL。如上所述here你可以通過使用命令加載此信息:

mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql -p 

所在的路徑/usr/share/zoneinfo可能需要用特定於系統的路徑來代替。