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, но хотелось бы обойтись без нее. Есть варианты?


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

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

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

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

Стандартная библиотека 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
() автор топика