在 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-8GMT+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 系統正確時區下的時間值。

Posted by yungyuc at 18:34, 0 comment, 0 trackback.
Navigate
Add a trackback
Add a comment

Your name. (required)

Your personal website. (optional)

Your email address. Will not show in page. (suggested, but optional)

Text format is "Plain Text".

Enter "vwPeS"
© hover year to navigate month: powered by django