我有一个为悉尼用户运行的 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:
标头设置为值DateTime().rfc822()
(在 MailHost.py 的第 466 行)。由于偏移量错误,因此 Date 标头中的时间现在是未来 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内部数据库将其转换为US/Eastern
。这是东部标准时间是多个时区名称的不幸副作用。
您需要指定一个更明确的TZ
变量,指定偏移量和 DST 切换日期,并使用不会被误解的新时区名称:
TZ="AEST-10AEDT-11,M10.1.0/02:00:00,M4.1.0/03:00:00"
上面的值来自仍然打开的错误报告,恰好非常适合您的目的:
$ 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