Django 如何根据我的时区将正确的时间写入DB?

Django 如何根据我的时区将正确的时间写入DB?,django,datetime,timezone,Django,Datetime,Timezone,当我在数据库中保存日期时,Django会显示关于在正确的时间成功添加的消息,但事实上,在数据库中,时间是不同的 models.py: from datetime import datetime from django.db import models class Teg1(models.Model): created_at = models.DateTimeField(default=datetime.now, null=True, blank=True, editable=Fal

当我在数据库中保存日期时,Django会显示关于在正确的时间成功添加的消息,但事实上,在数据库中,时间是不同的

models.py:

from datetime import datetime
from django.db import models


class Teg1(models.Model):
    created_at = models.DateTimeField(default=datetime.now, null=True, blank=True, editable=False)
    num = models.FloatField(default=0.0, null=True, blank=True)

    def __str__(self):
        return str(self.num) + " || " + str(self.created_at)
设置.py

TIME_ZONE = 'Asia/Novosibirsk'
USE_TZ = True

如果我没弄错的话,你一定在俄罗斯,比UTC早7个小时。因此,您使用的服务器必须使用UTC时间,我认为这是一件好事。
我个人更喜欢在数据库中保存UTC时间,然后在前端将其转换为本地时间

from django.utils import timezone
from datetime import datetime

teg1 = Teg1(created_at=datetime.now(tz=timezone.utc)
teg1.save()
但是,如果要在本地时间保存
datetime
,可以使用:

from datetime import datetime    
import pytz

novosibirsk = pytz.timezone("Asia/Novosibirsk")
now = datetime.now(novosibirsk)
teg1 = Teg1(created_at=now)
teg1.save()

请记住,在您的管理界面中,您可能会看到基于您在
settings.py
中选择的时区的时间和日期。但是,保存在数据库中的数据仍然是UTC时间。

如果我没有弄错的话,您一定在俄罗斯,比UTC早7小时。因此,您使用的服务器必须使用UTC时间,我认为这是一件好事。
我个人更喜欢在数据库中保存UTC时间,然后在前端将其转换为本地时间

from django.utils import timezone
from datetime import datetime

teg1 = Teg1(created_at=datetime.now(tz=timezone.utc)
teg1.save()
但是,如果要在本地时间保存
datetime
,可以使用:

from datetime import datetime    
import pytz

novosibirsk = pytz.timezone("Asia/Novosibirsk")
now = datetime.now(novosibirsk)
teg1 = Teg1(created_at=now)
teg1.save()

请记住,在您的管理界面中,您可能会看到基于您在
settings.py
中选择的时区的时间和日期。但是,保存在数据库中的数据仍然是UTC时间。

Django的第一句话解释了您看到的情况:

启用时区支持后,Django在数据库中以UTC格式存储日期时间信息,在内部使用时区感知的datetime对象,并以模板和表单将其转换为最终用户的时区

因此,数据库值以UTC为单位。
str()
值也是UTC格式,因为您已手动将UTC日期时间转换为字符串,而无需更改时区。表单解释并由模板显示的值是本地时间,因为模板将
DateTimeFields
转换为当前时区

如果希望
str()
值使用本地时区,可以使用Django函数:

from django.utils.timezone import localtime

class Teg1(models.Model):
    ...

    def __str__(self):
        return str(self.num) + " || " + str(localtime(self.created_at))

Django的第一句话解释了你所看到的:

启用时区支持后,Django在数据库中以UTC格式存储日期时间信息,在内部使用时区感知的datetime对象,并以模板和表单将其转换为最终用户的时区

因此,数据库值以UTC为单位。
str()
值也是UTC格式,因为您已手动将UTC日期时间转换为字符串,而无需更改时区。表单解释并由模板显示的值是本地时间,因为模板将
DateTimeFields
转换为当前时区

如果希望
str()
值使用本地时区,可以使用Django函数:

from django.utils.timezone import localtime

class Teg1(models.Model):
    ...

    def __str__(self):
        return str(self.num) + " || " + str(localtime(self.created_at))