在 Linux 上跑 Zope 的時候,時區設定是個麻煩的問題。在 Linux 上的 GMT 時區偏移中的負號代表超前 GMT;正號代表落後 GMT。不過就一般的 ISO-8601 和 RFC-2822 日期時間格式來說,負號代表落後 GMT;正號代表超前 GMT。舉個例子來看:
$ TZ=GMT-8 date --iso-8601=seconds 2005-08-03T15:11:13+0800 $ TZ=GMT-8 date --rfc-2822 Wed, 03 Aug 2005 15:11:19 +0800 $ TZ=GMT-7 date --iso-8601=seconds 2005-08-03T14:11:21+0700 $ TZ=GMT-7 date --rfc-2822 Wed, 03 Aug 2005 14:11:26 +0700
Zope 的 DateTime 模組取用的設定習慣是後者,也就是與 ISO-8601 和 RFC-2822 一致,這就和 Linux 時區設定相反了。而且, DateTime 不接受 TZ 那種 CST-8 的設法;更有甚者,在把 TZ 設為 GMT+/-n 的格式時, DateTime 會認定目前的時區為 GMT 。如果我們用 GMT-8 或 GMT+2 這一類的 TZ 字串來設定時區,在 Zope 裡面都會不正常。
Note
把 TZ 設為 CST-8 這種格式時,Linux 會認定 CST 為時區的名稱,而與 GMT 偏移 -8 ,即超前 8 小時。我們可以用這種寫法來自訂時區的名稱,例如 Taipei-8 。
我們在調整 Zope 時區設定的時候,通常會在 $instance/bin/runzope 指令稿裡加上
export TZ="Hongkong"
獨立進行設定,不直接繼承環境的設定。因為 DateTime 與 Linux 時區的語法不一致,所以我們儘可能得用 DateTime 與 Linux 兩方都接受的代名。以台灣和大陸來說,就是 Hongkong 。
不過... 事實上世界沒有如此美好。有些舊的系統 (Linux) 沒有 "Hongkong" 這個時區。怎麼辦呢?用 TZ="Hongkong-8" 讓 Linux 知道自己的時區 (超前 8 小時);同時讓 DateTime 取得到 Hongkong 字樣。
在設定時區的時候還發現了有趣的現象, DateTime() 出來的東西有時會和 Plone skin 裡 toLocalizedDate.py 的傳回值不一樣;這是因為 toLocalizedDate.py 呼叫的 CMFPlone.PloneUtilities.localized_time() 裡面有一行
return DateTime(str(time)).strftime(format)
用到了 DateTime().strftime() ,而這個函式就是 Python 的 time.strftime() 。它可以取到外部 Linux 系統正確時區下的時間值。
Please send trackback to: http://blog.seety.org/everydaywork/2005/8/3/391/trackback/.