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', то она больше не будет преобразовывать их при входе или выходе.