LINUX.ORG.RU

Python: сменить timezone стандартной библиотекой

 


0

1

Привет!

На Питоне 3.10 хочу получить дату с локальной машины и рассчитать ее на другой часовой пояс, используя только стандартные библиотеки. Нужные часовые пояса есть в виде списка строк типа 'Europe/Moscow', 'Europe/Berlin' для библиотеки zoneinfo, а часовой пояс локального компа может быть произвольным.

Определяю пояс компа так:

import datetime
datetime.datetime.now().astimezone().tzname()

Получаю строку вида 'MSK'

Чтобы перевести дату и время в нужный часовой пояс делаю примерно так:

import datetime
import zoneinfo
tz1 = datetime.datetime(year, month, day, hour, minute, tzinfo=zoneinfo.ZoneInfo('что сюда?')) # местное время компа
tz2 = tz1.astimezone(zoneinfo.ZoneInfo(key='Europe/Berlin')) # время пересчитывается для пояса Берлина

Но tzname выдает код пояса, а ZoneInfo требует строки формата 'Europe/Moscow', и код не подходит. Можно использовать внешнюю библиотеку pytz, но хотелось бы обойтись без нее. Есть варианты?


Выкинь это добро, datetime за пределами utc не существует. Возьми arrow, ник у тебя как раз подходит

upcFrost ★★★★★
()

ЯННП

Сначала надо локальное время перевести в UTC?

tz1 = datetime.datetime(...).astimezone(tz=datetime.timezone.utc)

или сразу его получить через utcnow()

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)

time.timezone остальное на курсах расскажут.

usi_svobodi
()
Ответ на: комментарий от vvn_black

tz1 - определяю время на компе и указываю через ZoneInfo к какому поясу оно относится tz2 - пересчитываю tz1 в нужный пояс

если для tz1 явно пояс не указывать, то будет ли корректно это?

arrow
() автор топика
Ответ на: комментарий от arrow

Почитайте документацию по ссылке. Подставьте нужную таймзону в функцию now и сразу получите, что надо

qaqa ★★
()
Последнее исправление: qaqa (всего исправлений: 1)

Стандартная библиотека zoneinfo использует пояса в виде «Europe/Moscow», соотвественно, надо на локальном компе получить пояс тоже в таком же виде. Без внешних библиотек пока не понял как.

arrow
() автор топика

Разобрался. Вот отсюда https://stackoverflow.com/a/64289812

from collections import defaultdict
from datetime import datetime as dt
from zoneinfo import available_timezones, ZoneInfo

now = dt.utcnow()
tz_key = lambda tz: ZoneInfo(tz).tzname(now)
tz_map = defaultdict(list)

for tz in available_timezones():
    tz_map[tz_key(tz)].append(tz)
tz_map = {k: sorted(v) for k, v in tz_map.items()}

Дальше понятно.

arrow
() автор топика
Ответ на: комментарий от upcFrost

Плюсую этого парня. Используй таймзоны только что бы переводить локальное время в UTC. А все внутренние операции уже в UTC делай

Aswed ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.