Как записать правильное время в БД в соответствии с моим часовым поясом? - PullRequest
0 голосов
/ 17 октября 2018

Когда я сохраняю даты в своей базе данных, 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

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Если я не ошибаюсь, вы должны быть в России, которая на 7 часов опережает UTC.Итак, сервер, который вы используете, должен использовать время 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 времени.

0 голосов
/ 17 октября 2018

Первое предложение документации часового пояса Django объясняет, что вы видите:

Когда включена поддержка часовых поясов, Django сохраняет информацию о дате и времени в формате UTC в базе данных.использует внутренние объекты datetime с учетом часового пояса и переводит их в часовой пояс конечного пользователя в шаблонах и формах.

Таким образом, значение базы данных указано в UTC.Значение str() также указано в UTC, поскольку вы вручную преобразовали дату и время UTC в строку без изменения часового пояса.Значение, интерпретируемое формой и отображаемое шаблоном, соответствует вашему местному времени, поскольку шаблоны преобразуют DateTimeFields в текущий часовой пояс.

Если вы хотите, чтобы значение str() использовало местный часовой пояс, вы можете использоватьФункция Джанго localtime():

from django.utils.timezone import localtime

class Teg1(models.Model):
    ...

    def __str__(self):
        return str(self.num) + " || " + str(localtime(self.created_at))
0 голосов
/ 17 октября 2018

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

Надеюсь, это работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...