我有一个正在为悉尼用户运行的 Plone 实例,因此 TZ 环境变量设置为 Australia/Sydney
。通过此设置,使用 Zope2 中的 DateTime
模块的代码会生成显示错误时区的结果。例如:
>>> import time
>>> import DateTime
>>> print time.strftime("%a, %d %b %Y %T %z") #
Thu, 20 Sep 2012 02:38:08 +1000
>>> print DateTime.DateTime().rfc822()
Thu, 20 Sep 2012 02:38:08 -0400
这是相当有问题的,因为 Products.MailHost
将传出电子邮件上的 Date:
header 设置为值 DateTime().rfc822()
(位于 MailHost.py 的第 466 行)。由于偏移量错误,Date header 中的时间现在是 future 12 小时后的时间。接收该电子邮件的 SMTP 服务器通常会立即拒绝它!
同一实例中的其他代码非常高兴地使用该 TZ 变量正确运行,因为它使用 Python 中的 datetime
模块,该模块全部基于 libc 的 time.h
功能。
那么,为了让 Plone 的 MailHost 在澳大利亚时区工作,人们该怎么做?
最佳答案
不幸的是,TZ=Australia/Sydney
变成 time.tzname == ('EST', 'EST')
:
$ TZ=Australia/Sydney bin/zopepy -c "import time; print time.tzname"
('EST', 'EST')
DateTime 内部数据库将其转换为美国/东部
。这是东部标准时间作为多个时区名称的一个不幸的副作用。
您需要指定一个更明确的 TZ
变量来指定偏移量和 DST 切换日期,并使用不会被误解的新时区名称:
TZ="AEST-10AEDT-11,M10.1.0/02:00:00,M4.1.0/03:00:00"
以上数值来自still open bug report并且恰好非常适合您的目的:
$ TZ="AEST-10AEDT-11,M10.1.0/02:00:00,M4.1.0/03:00:00" bin/zopepy
>>> import DateTime
>>> import sys
>>> m = sys.modules['DateTime.DateTime']
>>> m._findLocalTimeZoneName(0)
'GMT+10'
>>> m._findLocalTimeZoneName(1)
'GMT+11'
>>> import DateTime
>>> DateTime.DateTime()
DateTime('2012/09/21 00:12:0.765691 GMT+10')
>>> DateTime.DateTime().rfc822()
'Fri, 21 Sep 2012 00:12:04 +1000'
您可以通过在构建中指定 TZ
环境变量来将其添加到您的 Zope 配置中:
[instance]
recipe = plone.recipe.zope2instance
...
environment-vars =
TZ AEST-10AEDT-11,M10.1.0/02:00:00,M4.1.0/03:00:00
关于timezone - Plone MailHost 发送带有澳大利亚时区的错误日期 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12499725/