2013年7月6日 星期六

GAE 的時區問題

今天被 GAE 的時區搞得七暈八素, GAE 送出的郵件主旨裡, 用 today 紀錄的時間都不對, 慢 8 個小時, 現在是下午 4 點 33 分, 但 GAE 卻顯示 "2013-07-06 08:33:23". 查了一下才知 GAE 用的是 UTC 時間, 所以台北時間 HOUR 要加 8. 因為以前沒用到 GAE 的 datetime, date 等模組, 加上 Python 又不熟, 所以很頭痛.
根據這篇 "Python - Timezones" 說明, 我在 main.py 中加上 :

os.environ['TZ']='Asia/Taipei'
time.tzset()
subject=str(today) + " 盤後分析報告"

時區是設定進去了沒錯 (輸出 os.environ['TZ'] 有顯示 'Asia/Taipei'), 但是時間還是一樣 UTC. Why? 原因在 GAE 的這篇 "類型和 Property 類別" 有說明 :

"部分程式庫使用 TZ 環境變數來控制套用至日期時間值的時區。「應用服務引擎」將此環境變數設定為 "UTC"。 請注意,在應用程式中變更此值,不會變更某些日期時間函式的行為,因為在 Python 程式碼以外的範圍,看不到環境變數的變更"

也就是說, 這一招在 GAE 沒有作用. 
最後在 JiunJuin 君這篇 "[GAE] 時區設定 Asia/Taipei" Brian 的 "在 GAE 使用台灣時區", 與 memo 君的 "GAE 時區" 找到解法了, 原來如此, 呵呵.

from datetime import timedelta, datetime
taipei_time=datetime.now() + timedelta(hours=+8)
taipei_time=taipei_time.strftime('%F %T')
subject=taipei_time + " 盤後分析報告"

這樣郵件主旨就正確顯示 "2013-07-07 15:15:00 盤後分析報告" 啦. 這裏使用了 datetime 模組的 strftime() 方法, %F 表示以 YYYY-MM-DD 顯示日期, 而 %T 則以 HH:mm:SS 顯示時間, 中間用一空格隔開. 呵呵, 我的 Python 太弱了, 要找時間把常用的模組好好測試一番.

參考 :
Time zones in Google App Engine
Time access and conversions

沒有留言 :