我对夏令时处理有点困惑
settings.py:
TIME_ZONE = 'Europe/London'
USE_TZ = True
在 Django shell 中:
>>> 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
为什么它们在夏令时方面不一样?两者都应该能够识别区域设置,不是吗?
我已经阅读了文档,但并不明智。
根据timezone.now()
来源:
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)
从 Django 1.11 开始,你可以简单地调用 django.utils.timezone.localtime
来获取默认时区的datetime
。
>>> from django.utils import timezone
>>> timezone.localtime()
从文档中:
将感知日期时间转换为其他时区,默认情况下为当前时区。
省略值时,默认为
now()
。此函数不适用于朴素日期时间;请改用
make_aware()
。
你可以将参数传递给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/
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()
是一种选择
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)