【问题标题】:How to write the right time to DB according my timezone?如何根据我的时区将正确的时间写入数据库?
【发布时间】:2019-03-21 23:13:51
【问题描述】:

当我在我的数据库中保存日期时,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)

settings.py

TIME_ZONE = 'Asia/Novosibirsk'
USE_TZ = True

【问题讨论】:

    标签: django datetime timezone


    【解决方案1】:

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

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

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

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

    from django.utils.timezone import localtime
    
    class Teg1(models.Model):
        ...
    
        def __str__(self):
            return str(self.num) + " || " + str(localtime(self.created_at))
    

    【讨论】:

      【解决方案2】:

      如果我没记错的话,您一定是在比 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时间。

      【讨论】:

        【解决方案3】:

        而不是使用

        from datetime import datetime
        class Teg1(models.Model):
            created_at = models.DateTimeField(default=datetime.now)
        

        使用(这将使用您在settings.py 中设置的时区)

        from django.utils import timezone
        
        class Teg1(models.Model):
            created_at = models.DateTimeField(default=timezone.localtime())
        
        

        【讨论】:

          猜你喜欢
          • 2023-04-09
          • 1970-01-01
          • 2018-08-23
          • 2011-07-27
          • 1970-01-01
          • 1970-01-01
          • 2021-12-30
          • 2020-01-04
          • 1970-01-01
          相关资源
          最近更新 更多