2009-10-15 33 views
4

文档说:是否配置django的setting.TIME_ZONE会影响datetime.datetime.now()?

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

请注意,这是时区 着Django所有 日期/时间转换 - 不一定是 时区的服务器。例如,一个服务器可以服务多个 Django支持的站点,每个站点都有一个独立的时区设置,每个站点都有一个 。 通常,Django将 os.environ ['TZ']变量设置为您在TIME_ZONE 设置中指定的时间段 区域。因此,所有您的意见和 型号将自动运行在 正确的时区。

我已经读了好几遍了,但我不清楚TIME_ZONE设置是怎么回事。

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

例如在节省使用,datetime.datetime.utcnow()而不是datetime.datetime.now(),并在视图中做这样的事情:

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

回答

4

出乎我的意料,它似乎至。

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 

而且让我的对象创建自动添加时间戳(使用auto_now_add,我相信是的,我没有得到分心而写这个答案:-)

我使用TIME_ZONE设置为即将不赞成)在我设定的时区显示创建时间。

如果您想将这些时间转换为您网站访问者的时区,则需要按照您提供的示例做更多的工作。如果您想进行大量时区转换以在您的网站访问者时区中显示时间,那么我强烈建议您将您的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() 

的Windows:

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 
+0

我只是试图在这里使用manage shell重复你的测试,它似乎没有......奇怪。 >>> datetime.datetime.now()datetime.datetime(2009,10,15,15,37,47,869000)>>>导入设置>>> settings.TIME_ZONE'Europe/Zurich'>>> datetime.datetime .now()datetime.datetime(2009,10,15,15,37,59,838000)>>> exit()PS D:\> date Thu Oct 15 15:38:25 TST 2009 – monkut 2009-10-15 06:41:07

+0

无论如何,正如您所提到的这听起来像是一个好主意,只是使用UTC时间。 – monkut 2009-10-15 06:43:28

+0

我不知道这是因为我发布的来源106-107行的评论。尝试运行'hasattr(time,'tzset')'。 – 2009-10-15 09:23:30

1

TIME_ZONE作为UTC,utcnow()和now()是相同的。这可能是你想要的。那么你可以记录现在的时间/ utcnow和功能,如timesince将完美地为每个用户。要向特定用户显示绝对时间,可以按照您的建议使用utc偏移量。

相关问题