Timezone.now () против datetime.datetime.now ()

Когда мне следует использовать timezone.now() от django, а когда - datetime.datetime.now() на python.

Например, что из следующего INSERT имеет больше смысла?

- Product.objects.create(title='Soap', date_added=datetime.datetime.now())
- Product.objects.create(title='Soap', date_added=timezone.now())

Есть ли практическое правило, когда использовать каждый из них?


person David542    schedule 15.11.2014    source источник
comment
Полезна ли эта ссылка?   -  person helloV    schedule 15.11.2014


Ответы (3)


Просто всегда используйте timezone.now(). В Django теперь есть поддержка часовых поясов, для которой требуются объекты datetime, "знающие" часовой пояс. datetime.now() вернет наивный объект с часовым поясом, тогда как timezone.now() вернет объект с привязкой к часовому поясу.

Подробнее о часовых поясах Django

person dgel    schedule 15.11.2014
comment
Точнее, timezone.now() вернет наивный или осведомленный datetime в зависимости от настройки USE_TZ. - person Kevin Christopher Henry; 16.11.2014
comment
Не могли бы вы указать мне на ресурс, где я мог бы узнать больше о каждом? - person Shubham Aggarwal; 29.03.2016
comment
Конечно: docs.djangoproject.com /en/1.9/topics/i18n/timezones/ - person dgel; 30.03.2016
comment
Эта ссылка django 1.9 не работает, поэтому я добавил ссылку на текущую стабильную документацию - person culix; 11.01.2020

Вы можете написать в оболочке, например:

timezone.datetime.now() < timezone.now() 

И сообщение об ошибке:

TypeError: can't compare offset-naive and offset-aware datetimes

Это разные объекты, только timezone.now () поддерживает UTC

person eEmanuel Oviedo    schedule 09.10.2019
comment
Не могли бы вы уточнить, что означает поддержка UTC? - person Yokhen; 25.12.2019
comment
Из документации Django: объекты Python datetime.datetime имеют атрибут tzinfo, который можно использовать для хранения информации о часовом поясе, представленной как экземпляр подкласса datetime.tzinfo. Когда этот атрибут установлен и описывает смещение, объект datetime осведомлен. В противном случае это наивно. - person eEmanuel Oviedo; 08.01.2020
comment
только timezone.now () имеет поддержку UTC означает, что только timezone.now () имеет атрибут tzinfo - person eEmanuel Oviedo; 08.01.2020

Если вы хотите использовать UTC и используете Python 3.2 или выше, в этом ответе говорится, что вы можете:

import datetime
datetime.datetime.now(datetime.timezone.utc)

Это даст вам дату и время UTC с учетом часового пояса.

person culix    schedule 11.01.2020