【问题标题】:Python/Django MySQL Datetime handling and timezonePython/Django MySQL 日期时间处理和时区
【发布时间】:2013-06-30 18:40:49
【问题描述】:

我有一个名为 Vote 的模型,其字段为 date

date = models.DateTimeField(auto_now_add=True)

当我添加一个元素时,MySQL 中的日期是 UTC 日期,但我生活在 UTC+2 时区

我想我在settings.py 中正确设置了时区:

TIME_ZONE = 'Europe/Paris'

Python 使用正确的时区:

>>> print datetime.datetime.now()
2013-07-03 09:05:04.474000

MySQL 也是:

> SELECT NOW( )
2013-07-03 09:00:48

我可以手动设置日期属性,它可以工作,但我想知道为什么 auto_now_add 会返回错误的日期,尽管 python 和 mysql 使用正确的时区

谢谢

【问题讨论】:

    标签: python mysql django datetime timezone


    【解决方案1】:

    这是一个复杂的绑定来解释。来自Django 1.4

    当 USE_TZ 为 False 时,this 是 Django 将存储的时区 所有日期时间。当 USE_TZ 为 True 时,this 是默认时区 Django 将用于在模板中显示日期时间并解释 在表单中输入的日期时间。

    this 指的是TIME_ZONE。那么你的USE_TZ 是什么?如果您的 USE_TZ 为 True,则 Django 将以 UTC 格式存储日期时间并使用 TIME_ZONE 在模板中显示并解释表单。

    这是因为,如果您稍后在另一个地区托管您的网站时更改您的 TIME_ZONE,则可以轻松地将任何日期时间从 UTC 转换为任何给定的时区。

    Django 1.3 及更早版本中,

    请注意,this 是 Django 将所有 日期/时间——不一定是服务器的时区。例如, 一台服务器可以为多个由 Django 提供支持的站点提供服务,每个站点都有一个 单独的时区设置。

    通常,Django 将 os.environ['TZ'] 变量设置为时区 您在 TIME_ZONE 设置中指定。因此,您的所有视图和模型 将自动在正确的时区运行。

    但没有告诉您日期时间将在哪个时区存储在数据库中。无论如何都需要试验(我猜是UTC)。

    print datetime.datetime.now() 会根据您的服务器机器的时区设置打印数据时间,除非您通过manage.py shell 打开了 python 控制台。

    MySQL 控制台也是如此。如果我是对的,它会显示您机器时区中的日期时间,而不是存储在数据库中的日期时间。

    【讨论】:

    • 我的 USE_TZ 设置为 True,我更喜欢将日期存储在本地时区,所以我将 USE_TZ 设置为 False 并且它有效!谢谢
    • 请记住,如果您将其设置为False,那么在本地化您的应用程序时会遇到很大的麻烦。我更愿意将它存储在 UTC 中并编写一个中间件来为当前请求设置时区。如果你有时间,花点时间研究一下这个stackoverflow.com/questions/15065338/… :)
    • 好的,我的应用程序不应该本地化。但我为下一个开发者记住了这一点。感谢非常有用的评论
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2011-03-20
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多