【问题标题】:Does configuring django's setting.TIME_ZONE affect datetime.datetime.now()?配置 django settings.TIME_ZONE 会影响 datetime.datetime.now() 吗?
【发布时间】:2009-10-15 04:53:56
【问题描述】:

文档说:

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)

【问题讨论】:

    标签: python django datetime


    【解决方案1】:

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

    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()
    

    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
    

    【讨论】:

    • 我只是尝试在此处使用管理 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:\> 日期 Thu Oct 15 15:38:25 TST 2009
    • 无论如何,正如您所说,使用 UTC 时间听起来是个好主意。
    • 我想知道这是否是因为我发布的源代码第 106-107 行的 cmets。尝试运行hasattr(time, 'tzset')
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      相关资源
      最近更新 更多