pytz локализуют по сравнению с заменой даты и времени

Используйте структуру или класс для возвращаемого значения. Используя std::pair может работать на данный момент, но

  1. это негибко, если Вы решаете позже, что Вы хотите больше возвращенной информации;
  2. не очень ясно из объявления функции в заголовке, что возвращается и в какой порядок.

Возврат структуры с самодокументированием членских имен переменной, вероятно, будет менее склонным к ошибке для любого использующего Вашу функцию. Надев мою шляпу коллеги на мгновение, Ваш divide_result структура легка для меня, потенциального пользователя Вашей функции, сразу понять после 2 секунд. Бездельничание с ouput параметрами или таинственными парами и кортежами заняло бы больше времени для прочтения и может использоваться неправильно. И скорее всего даже после использования функции несколько раз я все еще не буду помнить правильного порядка аргументов.

47
задан Acumenus 5 May 2017 в 19:23
поделиться

2 ответа

localize просто предполагает, что наивное datetime, которое вы передаете, является «правильным» (за исключением того, что вы не знаете часовой пояс!), И поэтому просто устанавливает часовой пояс, никаких других настроек.

Вы можете (и это желательно ...) внутренне работают в формате UTC (а не с наивными датами времени) и используйте replace , когда вам нужно выполнить ввод-вывод времени дат локализованным способом ( normalize будет обрабатывать DST и тому подобное).

40
ответ дан 26 November 2019 в 19:50
поделиться

Этот класс DstTzInfo используется для часовых поясов, где смещение от UTC изменяется в определенные моменты времени. Например (как вы, вероятно, знаете), многие местоположения переходят на «летнее время» в начале лета, а затем обратно на «стандартное время» в конце лета. Каждый экземпляр DstTzInfo представляет только один из этих часовых поясов, но методы «локализовать» и «нормализовать» помогут вам получить правильный экземпляр.

Для Абиджана был только один переход (согласно pytz), и это было в 1912:

>>> tz = pytz.timezone('Africa/Abidjan')
>>> tz._utc_transition_times
[datetime.datetime(1, 1, 1, 0, 0), datetime.datetime(1912, 1, 1, 0, 16, 8)]

Объект tz, который мы получаем из pytz, представляет часовой пояс до 1912 года:

>>> tz
<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>

Теперь взглянув на два ваших примера, вы увидите, что когда вы вызываете tz.localize (d), вы делаете НЕ ] добавьте этот часовой пояс до 1912 года к вашему наивному объекту datetime. Предполагается, что указанный вами объект datetime представляет местное время в правильном часовом поясе для этого местного времени , который является часовым поясом после 1912 года.

Однако во втором примере с использованием d.replace (tzinfo = tz), ваш объект datetime должен представлять время в часовом поясе до 1912 года. Вероятно, вы не это имели в виду. Затем, когда вы вызываете dt.normalize, он преобразует это в часовой пояс, который является правильным для этого значения datetime, то есть часовой пояс после 1912 года.

4
ответ дан 26 November 2019 в 19:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: