Время печати Datetime без смещения

#python #django #datetime

#python #django #datetime

Вопрос:

В настоящее время я пытаюсь преобразовать время из UTC, и проблема, с которой я сталкиваюсь, заключается в том, что смещения кажутся обратными. Как вы можете видеть, когда я конвертирую UTC в EST, оно показывает смещение в -4:56, но когда я печатаю время, кажется, что добавляется 4: 56, а не так, как должно быть. Мне бы очень хотелось иметь возможность конвертировать время UTC в любой другой часовой пояс и отображать там местное время без смещения, чтобы UTC здесь был преобразован во что-то вроде строк 2019-03-06 9: 12 EST.

 >>> example.created
datetime.datetime(2019, 3, 6, 14, 8, 49, 841881, tzinfo=<UTC>)
>>> original_utc = example.created
>>> original_utc
datetime.datetime(2019, 3, 6, 14, 8, 49, 841881, tzinfo=<UTC>)
>>> conv_est = original_utc.replace(tzinfo=pytz.timezone('US/Eastern'))
>>> conv_est
datetime.datetime(2019, 3, 6, 14, 8, 49, 841881, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)
>>> print(conv_est)
2019-03-06 14:08:49.841881-04:56
>>> print(conv_est.astimezone())
2019-03-06 19:04:49.841881 00:00
  

Ответ №1:

Я подозреваю, что вы неправильно поняли метод .astimezone() .

Ваше исходное datetime указано в UTC

 >>> example.created
datetime.datetime(2019, 3, 6, 14, 8, 49, 841881, tzinfo=<UTC>)
  

Затем вы изменили информацию о часовом поясе для переменной conv_est , и действительно, она работает так, как задумано:

 >>> conv_est = original_utc.replace(tzinfo=pytz.timezone('US/Eastern'))
>>> conv_est
datetime.datetime(2019, 3, 6, 14, 8, 49, 841881, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)
  

Если вы печатаете эту переменную, она отображает правильную информацию

 >>> print(conv_est)
2019-03-06 14:08:49.841881-04:56
  

Но когда вы вызываете .astimezone() без какого-либо аргумента, то возвращаемым значением является datetime объект в UTC зоне; это означает, что метод также работает так, как задумано, возвращая тот же момент времени, но выраженный как localtime в UTC (это будет 7 вечера / 19:00 по UTC, когда в США / Восточной Европе будет 14:00).

 >>> print(conv_est.astimezone())
2019-03-06 19:04:49.841881 00:00
  

Вы можете проверить это самостоятельно, вычислив разницу (которая будет равна 0):

 >>> conv_est == conv_est.astimezone()
True
>>> conv_est - conv_est.astimezone()
datetime.timedelta(0)
  

Комментарии:

1. Это отвечает на ваш вопрос или я неправильно понял вашу проблему?

2. Да, я верю, что это то, что происходит, знаете ли вы способ, которым я могу распечатать conv_est в формате, где смещение равно 0? итак, распечатайте conv_est примерно в 9: 12 по восточному времени

3. Вы имеете в виду просто скрыть смещение часового пояса в выходной строке?

4. Я понял это, я неправильно понял метод astimezone, я обнаружил, что могу просто взять original_utc и вызвать original_utc.astimezone (pytz.timezone(‘US / Eastern’)), и это даст мне 09: 08:49, что я и искал, спасибо за помощь! Я отметил ваш ответ как правильный.