4

我有一个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 使用正确的时区

谢谢

4

1 回答 1

10

这是一个复杂的绑定来解释。从Django 1.4开始,

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

是指TIME_ZONE. 那么你的是什么USE_TZ?如果你USE_TZ是 True 那么 Django 将以 UTC 存储日期时间并用于TIME_ZONE在模板中显示和解释表单。

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

Django 1.3及更早版本中,

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

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

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

print datetime.datetime.now()根据您的服务器机器的时区设置打印数据时间,除非您通过manage.py shell.

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

于 2013-07-03T07:34:40.850 回答