【问题标题】:Why is pytz offset incorrect?为什么 pytz 偏移不正确?
【发布时间】:2011-11-12 09:39:59
【问题描述】:

我有一个 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 错误?还是我对 pytz 的理解有问题?我错过了什么?

【问题讨论】:

  • 您使用的是基于 Debian 的服务器吗?查看开发服务器和生产服务器上 /usr/share/zoneinfo/America/Montevideo 之间的区别

标签: pytz


【解决方案1】:

使用 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

【讨论】:

  • 干得好。现在偏移量是正确的。生产版本是 2009a。服务器没有 pip,虽然 easy_install 抱怨“== 2011h”,但它确实安装了包。我曾尝试升级 pytz,但我是手动进行的,而不是使用 easy_install。显然,最新版本的 pytz 不适用于 python 2.5,而且我没有意识到我所要做的就是删除旧版本并让 easy_install 为我的 python 版本提供最新的可用包。再次,干得好。谢谢!现在回到集成...
猜你喜欢
  • 2015-07-20
  • 2016-09-11
  • 2019-02-04
  • 2014-04-17
  • 2011-07-20
  • 2014-10-16
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
相关资源
最近更新 更多