Django и postgres преобразуют часовой пояс в UTC

В моем приложении пользователи указывают свой часовой пояс и сохраняют его.

Поэтому я обрабатываю преобразование часовых поясов вручную

    local_time = datetime.now(tz=ZoneInfo(self.time_zone))

Все равно, когда я сохраняю в postgres, он конвертируется обратно в UTC 0.

В настройках:

    # TIME_ZONE = 'UTC' #commented out
    USE_L10N = False
    USE_TZ = False

Это тоже не сработало, поэтому я сделал промежуточное ПО:

    # CUSTOM TIME ZONE HANDLER
    class TimezoneMiddleware:
        def __init__(self, get_response):
            self.get_response = get_response

        def __call__(self, request):
            time_zone = "US/Pacific" #will be changed to a fn call
            if time_zone:
                timezone.activate(pytz.timezone(time_zone))
            else:
                timezone.deactivate()
            return self.get_response(request)

В настройках:

    MIDDLEWARE = [
        ...
        'time_log_app.utils.TimezoneMiddleware',
    ]

Это функция, которая вставляет данные:

    def insert_data_time_log(user, data):
       #this is the data obj before insertion

    {
    'clock_out': datetime.datetime(2021, 8, 21, 8, 16, 30, 420947, tzinfo=zoneinfo.ZoneInfo(key='US/Pacific')), 
    'hourly_rate': 50
    }
        ...
        TimeLog.objects.create(**data)

Это тоже не работает!!!

Я почти потерял надежду, что я делаю неправильно?

Или я должен использовать для этого raw sql?

PostgreSQL всегда хранит timestamptz в UTC, но конвертирует их в часовой пояс вашей сессии, когда отправляет их вам обратно (и когда получает их от вас, интерпретирует их как часовой пояс вашей сессии, если в них нет явного указания часового пояса). Если вы хотите видеть их в часовом поясе, отличном от часового пояса вашей сессии, вы можете изменить часовой пояс вашей сессии set timezone='US/Pacific' или преобразовать их с помощью python, когда они вернутся обратно.

Если вы объявите их в базе данных как 'timestamp without time zone', то она больше не будет преобразовывать их при входе или выходе.

Вернуться на верх