Ошибка astimezone в машине linux - PullRequest
3 голосов
/ 06 апреля 2020

Я использую linux aws машину, и есть разница во времени, когда я делаю datetime.datetime.now. Таким образом, я попробовал этот метод, чтобы преодолеть ошибку часового пояса

format = "%Y-%m-%d %H:%M:%S %Z%z"
current_date = datetime.datetime.now()
now_asia = current_date.astimezone(timezone('Asia/Kolkata'))
print(now_asia.strftime(format))

, когда я выполняю свою оконную машину, я не получил никакой ошибки. Те же строки, когда я использую в своей машине linux, я получаю «ValueError: astimezone () не может быть применено к наивному дате / времени»

Для отладки я попробовал методы, которые упомянуты в этой ссылке pytz и astimezone () не могут быть применены к наивному datetime

, когда я попробовал первый ответ, я не получаю никакой ошибки, но часовой пояс не преобразован. когда я попробовал второй ответ, я получаю сообщение об ошибке «AttributeError:« модуль »объект не имеет атрибута« utcnow »

Я пытался это

>>>loc_date = local_tz.localize(current_date)
>>> loc_date
datetime.datetime(2020, 4, 6, 7, 23, 36, 702645, tzinfo=<DstTzInfo 'Asia/Kolkata' IST+5:30:00 STD>)
>>> loc_date.strftime(format)
'2020-04-06 07:23:36 IST+05:30'

Я получаю это, поэтому в соответствии с Индийское время, если мы добавим 5:30, это будет правильно. Как мне это сделать.

1 Ответ

2 голосов
/ 14 апреля 2020

Пожалуйста, убедитесь, что вы действительно используете интерпретатор Python 3.7 в облаке. Ссылаясь на документацию для функции astimezone() :

Изменено в версии 3.6: метод astimezone () теперь можно вызывать для наивных экземпляров, которые Предполагается, что оно представляет системное местное время .

Действительно, я только что протестировал скрипт, используя Python 3.5.9 и pytz 2019.3, и получаю

  File "timez.py", line 6, in <module>
    now_asia = current_date.astimezone(timezone('Asia/Kolkata'))
ValueError: astimezone() cannot be applied to a naive datetime

Но при использовании Python 3.7.6 на экземпляре Amazon Linux 2 AMI код работает правильно.

Тем не менее, я бы предложил использовать даты и времени с учетом часовых поясов с самого начала.

В коде, на который вы ссылаетесь , вы получаете отсутствие атрибута utcnow, потому что этот код импортирует from datetime import datetime, а вы делаете import datetime. Чтобы заставить его работать, вы должны использовать

now_utc = datetime.datetime.utcnow().replace(tzinfo=pytz.utc)

Но обратите внимание, что Python документация теперь предлагает вам использовать параметр tz в datetime.now:

import datetime
import pytz

now_utc = datetime.datetime.now(tz=pytz.utc)
local_tz = pytz.timezone('Asia/Kolkata')
now_asia = now_utc.astimezone(local_tz)

format = "%Y-%m-%d %H:%M:%S %Z%z"
print(now_asia.strftime(format))

который печатает 2020-04-22 09:25:21 IST+0530 в моем случае.

...