为什么pytz偏移量不正确?

为什么pytz偏移量不正确?,pytz,Pytz,我有一个python应用程序,它向不同时区的用户发送电子邮件提醒。开始时间设置为给定的日期和时间,提醒可能设置为开始时间之前的分钟数 以前的开发人员没有考虑用户的时区,因此总是根据服务器的时间发送提醒 使用,我最初尝试在所有方面使用UTC,虽然这在开发过程中起作用,但在生产过程中提醒仍处于关闭状态。起初,我认为这是服务器上NTP的问题,但事实并非如此 我想确认开发和生产的行为确实不同,因此我创建了一个简单的脚本,用于在两者之间进行测试: server_time = datetime.dateti

我有一个python应用程序,它向不同时区的用户发送电子邮件提醒。开始时间设置为给定的日期和时间,提醒可能设置为开始时间之前的分钟数

以前的开发人员没有考虑用户的时区,因此总是根据服务器的时间发送提醒

使用,我最初尝试在所有方面使用UTC,虽然这在开发过程中起作用,但在生产过程中提醒仍处于关闭状态。起初,我认为这是服务器上NTP的问题,但事实并非如此

我想确认开发和生产的行为确实不同,因此我创建了一个简单的脚本,用于在两者之间进行测试:

server_time = datetime.datetime.utcnow()
print "Server Time:", server_time

user_timezone = pytz.timezone('America/Montevideo')
print "User Timezone:", user_timezone

user_offset = user_timezone.utcoffset(server_time)
print "Offset:", user_offset

user_datetime = server_time + user_offset
print "User Time:", user_datetime
开发结果(正确):

生产结果(不正确):

所以看起来pytz只是给出了错误的偏移量。请注意,如果我使用不同的时区,这并不重要;我试过的每一个都给出了错误的偏移量

至于环境的不同,两者都是Ubuntu的盒子,但生产运行的是Python2.5.2,开发运行的是2.6.2

没有太多,我也没有在我的搜索中找到不同偏移量的原因


那么,我的生产服务器上的pytz数据有问题吗?皮茨虫?还是我对pytz的理解有问题?我缺少什么?

使用pytz 2010版

$ python test.py 
Server Time: 2011-09-16 00:20:49.479426
User Timezone: America/Montevideo
**Offset: -1 day, 20:15:00** wrong!
User Time: 2011-09-15 20:35:49.479426-03:00
使用pytz 2011版本

$ python test.py 
Server Time: 2011-09-16 00:36:54.764812
User Timezone: America/Montevideo
**Offset: -1 day, 21:00:00** great!
User Time: 2011-09-15 21:36:54.764812
查看pytz.VERSION,确保您至少使用了2011h

>>> import pytz
>>> pytz.VERSION
'2011h'
如果您有2010,请卸下并更换:

>>> pytz.__file__
/usr/lib/python2.6/dist-packages/pytz/__init__.pyc

$ sudo rm -r /usr/lib/python2.6/dist-packages/pytz*
$ sudo pip install pytz == 2011h

您使用的是基于Debian的服务器吗?在您的开发和生产服务器上查看/usr/share/zoneinfo/America/Montevideo之间的差异做得不错。偏移量现在是正确的。生产版本为2009年a。服务器没有pip,尽管easy_install抱怨“==2011h”,但它确实安装了该软件包。我曾尝试升级pytz,但我是手动升级的,而不是使用easy_install。显然,pytz的最新版本不适用于Python2.5,我没有意识到我需要做的只是删除旧版本,让easy_install为我的python版本提供最新的可用软件包。再一次,干得好。谢谢现在回到集成。。。
>>> import pytz
>>> pytz.VERSION
'2011h'
>>> pytz.__file__
/usr/lib/python2.6/dist-packages/pytz/__init__.pyc

$ sudo rm -r /usr/lib/python2.6/dist-packages/pytz*
$ sudo pip install pytz == 2011h