#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, что я и искал, спасибо за помощь! Я отметил ваш ответ как правильный.