Python Django преобразование временной метки из UTC в местный часовой пояс
Я работаю с Django + DRF, чтобы разработать REST API. Я настроил параметры django для работы с поддержкой часовых поясов на:
USE_I18N = True
USE_L10N = True
USE_TZ = True
Как уже говорилось ранее, моя база данных получает и хранит данные в UTC. Моя проблема заключается в том, что для некоторых пользователей (каждый пользователь имеет свою конфигурацию) я должен возвращать ответы в их часовом поясе (обычно в UTC-3 или UTC-2). Я читал несколько постов и пробовал несколько комбинаций: astimezone
и normalize
безрезультатно. Я прилагаю свои попытки:
timezone_arg = pytz.timezone('America/Buenos_Aires')
print(ts_a, ts_b)
ts_a = ts_a.astimezone(timezone_arg)
ts_b = ts_b.astimezone(timezone_arg)
print(ts_a, ts_b)
utc = pytz.timezone('UTC')
ts_a = timezone_arg.normalize(ts_a.astimezone(utc))
ts_b = timezone_arg.normalize(ts_b.astimezone(utc))
print(ts_a, ts_b)
Я получаю следующее:
2022-06-17 05:39:09 2022-06-17 05:46:49
2022-06-17 05:39:09-03:00 2022-06-17 05:46:49-03:00
2022-06-17 05:39:09-03:00 2022-06-17 05:46:49-03:00
Я понимаю, что django интерпретирует то, что я говорю ему, что временные метки уже находятся в UTC-3... и он нормализует их к UTC. Но что я хочу, так это преобразовать время из UTC в UTC-3. Мои входные/выходные данные должны быть такими:
2022-06-17 05:39:09 2022-06-17 05:46:49
2022-06-17 02:39:09 2022-06-17 02:46:49
Поскольку я работаю не только с часовым поясом Аргентины (UTC-3), я не могу вычислить временную дельту в 3 часа... разница может быть другой для других клиентов. Моим последним ресурсом было бы использование -03:00:00 в конце нормализованных временных меток и вычитание. Но я хотел бы знать, есть ли более прямой и правильный способ. Эти временные метки отправляются непосредственно пользователям и должны быть легко читаемы.
Это было бы что-то вроде этого
from datetime import datetime
from dateutil import tz
from_zone = tz.tzutc()
to_zone = tz.tzlocal()
utc = datetime.strptime('2022-06-17 05:39:09', '%Y-%m-%d %H:%M:%S')
utc = utc.replace(tzinfo=from_zone)
# Convert to local time zone
to_local_time = utc.astimezone(to_zone)
print(utc,to_local_time)