Wednesday, October 15, 2014

ubuntu + mysql 時間/時區問題

在 OJ 上還沒開始的 contest 已經可以被看見了 OAO
時間/時區出問題 OAO
(顯示為崩潰

1. 系統時間/時區

$ date
Wed Oct 15 21:26:57 PDT 2014
$ date --utc
Thu Oct 16 04:30:28 UTC 2014

一開始不知為何系統時區被改成 PDT[1],比台灣時區慢了...應該是 16 小時
但時間跟台灣時間一樣
所以 16 小時之內開始的 contest 題目就被看光光惹

用 date 直接改[2]
$ sudo date 1015213214 # 10/15 21:32 2014
Wed Oct 15 21:32:00 PDT 2014
好像沒有動...

改成用 UTC 調時間[2]
$ sudo date -u 1015213214
Wed Oct 15 21:32:00 UTC 2014
不小心改成 UTC,但還是用台灣時間,所以比實際時間快了 8 小時
更慘的是時區沒動到,是一個奇怪的時間
$ date
Wed Oct 15 14:33:02 PDT 2014

後來查到可以用 dpkg-reconfigure tzdata 改[3]
$ sudo dpkg-reconfigure tzdata
Current default time zone: 'Asia/Taipei'
Local time is now:      Thu Oct 16 05:35:45 CST 2014.
Universal Time is now:  Wed Oct 15 21:35:45 UTC 2014.
$ date
Thu Oct 16 05:35:54 CST 2014
愈來愈奇怪了...
發現還少一步,用 ntpdate time.stdtime.gov.tw 校正時間
$ sudo ntpdate time.stdtime.gov.tw
15 Oct 21:36:59 ntpdate[54005]: step time server 118.163.81.61 offset -28761.160063 sec
$ date
Wed Oct 15 21:37:02 CST 2014
好像對了

不過這時候從 mysql 那邊出來的時間還是不對 orz
進入下一步


2. mysql 時間

系統時間對了接著就懷疑 code 寫爛掉
query 長這樣
select * from contest where start_time > NOW()
怎麼看都覺得很正常
所以懷疑一下 NOW() 出問題

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2014-10-15 06:57:57 |
+---------------------+
看起來就像是時區的問題

所以就想辦法改時區[4]
首先確認一下沒有殺錯人
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | PDT    |
| time_zone        | SYSTEM |
+------------------+--------+
然後就可以安心下刀
mysql> set time_zone='+8:00';

看看成果
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | PDT    |
| time_zone        | +08:00 |
+------------------+--------+
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2014-10-15 21:59:26 |
+---------------------+
結果相當令人滿意

BUT!!!
網頁上的還是不對
所以重開一下 mysql
$ sudo service mysql restart

finally fixed..... (呼~)


3. 追究原因

總而言之就是如果用 mysql 的時間會被弄死[5]
MySQL 內可以儲存「日期與時間」的資料型態是 DATETIME 與 TIMESTAMP 兩種,不過 DATETIME 沒有時區觀念,而 TIMESTAMP 只能是 UTC (GMT+0)。
我查證過了,OJ 用的不是香蕉是 DATETIME
然後...我也不知道為什麼
懶得想zzz


4. References

[1] http://zh.wikipedia.org/wiki/%E5%A4%AA%E5%B9%B3%E6%B4%8B%E6%97%B6%E5%8C%BA
[2] http://wiki.debian.org.hk/w/Set_date_and_time
[3] http://blog.longwin.com.tw/2009/12/ubunut-linux-set-zone-ntp-time-2009/
[4] http://blog.xuite.net/jyoutw/xtech/47098613
[5] http://blog.gslin.org/archives/2014/01/31/4209/mysql-%E8%A3%A1%E5%84%B2%E5%AD%98%E6%99%82%E9%96%93%E7%9A%84%E6%96%B9%E5%BC%8F/

No comments:

Post a Comment