2

我有一个正在为悉尼用户运行的 Plone 实例,因此 TZ 环境变量设置为Australia/Sydney. 有了这个集合,使用DateTimeZope2 中的模块的代码会产生显示错误时区的结果。例如:

>>> 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.MailHostDate:传出电子邮件的标头设置为该值DateTime().rfc822()(在 MailHost.py 的第 466 行)。由于偏移量错误,Date 标头中的时间现在是未来 12 小时。接收该电子邮件的 SMTP 服务器通常会立即拒绝它!

同一实例中的其他代码非常高兴地使用该 TZ 变量正确运行,因为它使用datetimePython 中的模块,这一切都基于 libc 的time.h函数。

那么,为了让 Plone 的 MailHost 在澳大利亚时区工作,人们做了什么?

4

1 回答 1

2

不幸的是,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通过在 buildout 中指定环境变量来将环境变量添加到 Zope 配置中:

[instance]
recipe = plone.recipe.zope2instance
...
environment-vars =
    TZ AEST-10AEDT-11,M10.1.0/02:00:00,M4.1.0/03:00:00
于 2012-09-20T13:05:32.560 回答