我有一个 python 应用程序向不同时区的用户发送电子邮件提醒。开始时间设置为给定的日期和时间,并且可以将提醒设置为开始时间之前的几分钟。
以前的开发者没有考虑到用户的时区,所以总是根据服务器的时间发送提醒。
使用pytz 文档,我最初尝试将 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。
pytz 报告的错误并不多,而且我在任何搜索中都没有找到不同偏移量的原因。
那么这是我的生产服务器上的 pytz 数据的问题吗?一个 pytz 错误?还是我对 pytz 的理解有问题?我错过了什么?