配置django的setting.TIME_ZONE会影响datetime.datetime.now()吗?

时间:2009-10-15 04:53:57

标签: python django datetime

文档说:

http://docs.djangoproject.com/en/dev/ref/settings/#time-zone

  

请注意,这是时区   哪个Django会转换所有   日期/时间 - 不一定是   服务器的时区。例如,   一台服务器可以服务多个   Django驱动的站点,每个都有一个   单独的时区设置。   通常,Django设置   os.environ ['TZ']变量到时候了   您在TIME_ZONE中指定的区域   设置。因此,你的所有观点和   模型将自动运行   正确的时区。

我已多次阅读此内容并且我不清楚TIME_ZONE设置发生了什么。

如果我希望带有日期时间戳的模型显示给用户本地时区,我是否应该管理UTC偏移?

例如,在save use,datetime.datetime.utcnow()而不是datetime.datetime.now()上,并在视图中执行以下操作:

display_datetime = model.date_time + datetime.timedelta(USER_UTC_OFFSET)

2 个答案:

答案 0 :(得分:5)

令我惊讶的是,它似乎确实如此。

web81:~/webapps/dominicrodger2/dominicrodger$ python2.5 manage.py shell
Python 2.5.4 (r254:67916, Aug  5 2009, 12:42:40)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import settings
>>> settings.TIME_ZONE
'Europe/London'
>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2009, 10, 15, 6, 29, 58, 85662)
>>> exit()
web81:~/webapps/dominicrodger2/dominicrodger$ date
Thu Oct 15 00:31:10 CDT 2009

是的,我在写这个答案的时候确实心烦意乱: - )

我使用TIME_ZONE设置,以便我自动添加对象创建的时间戳(使用auto_now_add,我相信很快就会弃用)在我设置的时区中显示创建时间。

如果您想将这些时间转换为网站访问者的时区,则需要根据您提供的示例进行更多工作。如果您想要在网站访问者的时区进行大量时区转换以显示时间,那么我强烈建议您将TIME_ZONE设置设置为以UTC格式存储的时间,因为它会让您的生活更轻松从长远来看(你可以使用UTC偏移,而不必担心夏令时)。

如果您有兴趣,我相信时区是根据TIME_ZONE设置here设置的。

根据您的评论编辑,它在Windows上不起作用,这是因为Django源中的以下内容:

if hasattr(time, 'tzset'):
    # Move the time zone info into os.environ. See ticket #2315 for why
    # we don't do this unconditionally (breaks Windows).
    os.environ['TZ'] = self.TIME_ZONE
    time.tzset()

<强>窗:

C:\Documents and Settings\drodger>python
ActivePython 2.6.1.1 (ActiveState Software Inc.) based on
Python 2.6.1 (r261:67515, Dec  5 2008, 13:58:38) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> hasattr(time, 'tzset')
False

<强> Linux的:

web81:~$ python2.5
Python 2.5.4 (r254:67916, Aug  5 2009, 12:42:40)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> hasattr(time, 'tzset')
True

答案 1 :(得分:1)

TIME_ZONE为UTC,utcnow()和now()是相同的。这可能就是你想要的。然后你可以将时间记录为now / utcnow,像timesince这样的函数将完美地适用于每个用户。要显示特定用户的绝对时间,您可以按照建议使用utc偏移量。