如何根据我的时区将正确的时间写入数据库?

时间:2018-10-17 09:57:07

标签: django datetime timezone

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

django admin timezone issue

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果我没记错的话,您必须比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时间。

答案 2 :(得分:0)

而不是使用

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

答案 3 :(得分:-1)

settings.py:

def boolean(val):
    """
    Convert strings "True" or "False" to corresponding boolean value.
    """
    if val == 'True':
        return True
    if val == 'False':
        return False
    raise Exception('Not a boolean data type')

def gfe(key, default=None):
    """
    Get value of supplied key from environment. If it is not found, and default
    value to be supplied is provided, then return that. Otherwise exit from
    further execution.
    """
    if default is None:
        try:
            return os.environ[key]
        except KeyError:
            print ('==========================================================')
            print ('ERROR: Environment variable "%s" is missing.' % key)
            print ('==========================================================')
            sys.exit(1)
    return os.environ.get(key, default)

TIME_ZONE = gfe('TIME_ZONE', 'UTC')
#USE_I18N = boolean(gfe('USE_I18N', 'True'))
#USE_L10N = boolean(gfe('USE_L10N', 'True'))
USE_TZ = boolean(gfe('USE_TZ', 'True'))

希望这行得通

相关问题