我有一个python应用程序,它向不同时区的用户发送电子邮件提醒。开始时间设置为给定的日期和时间,提醒可以设置为开始时间之前的某个分钟数。
之前的开发人员没有考虑用户的时区,因此始终根据服务器的时间发送提醒。
使用pytz documentation,我最初尝试将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
开发结果(正确):
Server Time: 2011-09-07 16:53:00.711334
User Timezone: America/Montevideo
Offset: -1 day, 21:00:00
User Time: 2011-09-07 13:53:00.71133
生产结果(不正确):
Server Time: 2011-09-07 16:53:01.767143
User Timezone: America/Montevideo
Offset: -1 day, 20:15:00
User Time: 2011-09-07 13:08:01.767143
所以看起来pytz只是给出了错误的偏移量。请注意,如果我使用不同的时区,则无关紧要;我试过的每一个都给出了错误的偏移量。
至于环境的差异,两者都是Ubuntu盒子,但生产是运行Python 2.5.2,开发是2.6.2。
bugs reported for pytz并不多,我在搜索中找不到不同抵消的原因。
这对我生产服务器上的pytz数据有疑问吗?一个pytz bug?或者我对pytz的理解有问题?我错过了什么?
答案 0 :(得分:2)
使用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