django 1.4 timezone.now() 与 datetime.datetime.now()
Posted
技术标签:
【中文标题】django 1.4 timezone.now() 与 datetime.datetime.now()【英文标题】:django 1.4 timezone.now() vs datetime.datetime.now() 【发布时间】:2012-06-02 18:35:14 【问题描述】:我对夏令时处理有点困惑
settings.py:
TIME_ZONE = 'Europe/London'
USE_TZ = True
在 django 外壳中:
>>> from django.utils import timezone
>>> import datetime
>>> print timezone.now()
2012-05-28 11:19:42.897000+00:00
>>> print timezone.make_aware(datetime.datetime.now(),timezone.get_default_timez
one())
2012-05-28 12:20:03.224000+01:00
为什么它们在夏令时方面不一样?两者都应该知道语言环境,不是吗?
我已经阅读了文档,但并不明智。
【问题讨论】:
【参考方案1】:根据timezone.now()
source:
def now():
"""
Returns an aware or naive datetime.datetime, depending on settings.USE_TZ.
"""
if settings.USE_TZ:
# timeit shows that datetime.now(tz=utc) is 24% slower
return datetime.utcnow().replace(tzinfo=utc)
else:
return datetime.now()
它基于utc
而不是您的默认时区。您可以通过使用实现相同的价值
now = timezone.make_aware(datetime.datetime.now(),timezone.get_default_timezone())
print now.astimezone(timezone.utc)
【讨论】:
这有点违反直觉。我以为 timezone.now() 现在会在默认时区给我!在我看来不是很pythonic。使用 .astimezone() 解决了我的问题,谢谢。 为什么我在执行以下操作时总是报错: >>> import datetime >>> from django.utils import timezone >>> from polls.models import Question >>> # create a pub_date 未来 30 天的问题实例 >>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30)) >>> # 它是最近发布的吗? >>> future_question.was_published_recently() True >>> future_question.was_published_recently() Traceback(最近一次调用最后):文件“was_published_recently
中尝试timezone.now()
而不是datetime.datetime.now()
。
@meepmeep 这确实违反直觉。第一眼看去。在第二种情况下,您可能会意识到发生这种情况是因为 Django 将时间保持在 UTC 中,直到它必须将其呈现给用户。这就是转换发生的地方。模板标签如now
does这个automatically。【参考方案2】:
从 Django 1.11 开始,您可以简单地调用 django.utils.timezone.localtime
来获取默认时区的 datetime
。
>>> from django.utils import timezone
>>> timezone.localtime()
来自文档:
将感知的日期时间转换为不同的时区,默认为当前时区。
省略值时,默认为
now()
。此功能不适用于原始日期时间;请改用
make_aware()
。
【讨论】:
返回 2019 年 5 月 24 日下午 1:14。根据 windows 的时间是下午 3:14【参考方案3】:您可以将参数传递给datetime.datetime.now()
:
import pytz, datetime
utc = pytz.utc
utc_now = datetime.datetime.now(tz=utc)
或者使用timezone
,啦啦:
from django.utils import timezone
now = timezone.now()
https://docs.djangoproject.com/en/2.1/topics/i18n/timezones/
【讨论】:
【参考方案4】:from datetime import datetime
from django.utils import timezone
def now():
try:
return timezone.localtime(timezone.now()).strftime('%Y-%m-%dT%H:%M:%S')
except Exception as exp:
print('TimeZone is not set - '.format(exp))
return datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
如果您在 Django 设置中设置了 TIME_ZONE = 'Europe/London'
和 USE_TZ = True
,您将放置在 try
部分中,否则,将放置在 except
部分中。
[注意]:
.strftime()
是一个选项
【讨论】:
【参考方案5】:from datetime import datetime
from pytz import timezone
# one can get any time for respective timezone
current_time = datetime.now(timezone('Asia/Kolkata'))
print("time in india :", current_time)
【讨论】:
以上是关于django 1.4 timezone.now() 与 datetime.datetime.now()的主要内容,如果未能解决你的问题,请参考以下文章
python 使用Django单位中的自定义日期模拟/替换timezone.now()