我有一个文件,我使用ctime检查它的创建时间。以下是代码片段(不完整,只是重要部分):
import time
import pytz
import os
from datetime import datetime
myfile = SOMEWHERE
myfile_ctime = os.path.getctime(myfile)
d = datetime.strptime(time.ctime(myfile_ctime), '%a %b %d %H:%M:%S %Y')
# d here is Tue Mar 25 00:33:40 2014 for example
ny = pytz.timezone("America/New_York")
d_ny = ny.localize(d)
mytz = pytz.timezone(MY_TZ_WHATEVER)
myd = d_ny.astimezone(mytz)
final_date = myd.strftime('%Y-%m-%d %H:%M:%S')
print(final_date + "some string")
# is now 2014-03-25 01:33:40some string, correctly with the timezone.
当它作为一个简单的python脚本运行时,一切正常。但是当我在templatetags/myfile.py
中的一个函数中运行相同的代码时,它会渲染到Django App中的模板,当我尝试从time.ctime(myfile_ctime)
获取日期时,我得到了 Tue Mar 25 04:33:40 而不是 Tue Mar 25 00:33:40 来自上面的代码段(代码相同 in独立脚本和Django - 我将日期与另一个字符串连接起来。)
我的问题是:我只使用Python标准库,两个地方都使用相同的代码片段,在同一环境中读取相同的文件。为什么不同? settings.py 中的设置是否会破坏标准库中的某些内容?只是在Django环境中它会改变标准库应该如何工作?为什么在调用独立时一切正常?
(我在apache后面,不知道这是否相关)
答案 0 :(得分:1)
确保settings.py中的时区设置,有关Django时区设置的详细信息,请查看此页:https://docs.djangoproject.com/en/1.6/ref/settings/#time-zone
答案 1 :(得分:1)
在./django/conf/__init__.py:126:
中,TZ
环境变量基于settings.py
设置。
os.environ['TZ'] = self.TIME_ZONE
我的TIME_ZONE是UTC。
这就是为什么独立脚本结果与Django中的代码段不同的原因:当独立运行时,此环境变量TZ
未设置。
现在,当从myfile_ctime创建一个datetime对象时,我只需要从我的服务器(/etc/sysconfig/clock
)添加tzinfo。我的代码现在看起来像这样:
import time
import pytz
import os
from datetime import datetime
myfile = SOMEWHERE
myfile_ctime = os.path.getctime(myfile)
ny = pytz.timezone("America/New_York")
d = datetime.fromtimestamp(myfile_ctime, tz=ny)
mytz = pytz.timezone(MY_TZ_WHATEVER)
myd = d.astimezone(mytz)
final_date = myd.strftime('%Y-%m-%d %H:%M:%S')
我希望这对某人有用。一如既往,请阅读来源。 :)