Django:activate()无效的解决方法

4

我在 python manager.py shell 中有以下代码:

>>> import pytz
>>> from django.utils import timezone
>>> zone = "Asia/Kolkata"
>>> timezone.activate(pytz.timezone(zone))
>>> timezone.now()
datetime.datetime(2014, 12, 17, 1, 52, 0, 411937, tzinfo=<UTC>)

但是我得到的输出仍然使用UTC。难道它不应该转换成“亚洲/加尔各答”吗?

更新

如果我使用下面dazedconfused建议的命令:

zone = "Asia/Kolkata"
if zone:
    timezone.activate(pytz.timezone(zone))
else:
    timezone.deactivate()
utc_date = datetime.utcnow()
aware_date = timezone.make_aware(utc_date, timezone.utc)
l_time = timezone.localtime(aware_date, timezone.get_current_timezone())

现在,当我尝试将其保存到我的数据库(Mongolab上的Mongodb)中时,它会以UTC格式保存。

我的数据库中有一个DateTimeField

尽管当我将其保存为简单字符串时,它会以当前时区“Asia/kolkata”保存。字符串输出为:2014-12-17 11:01:53.028852+05:30

1个回答

4

它实际上成功将当前时区设置为"亚洲/加尔各答"

您可以通过以下方式进行验证:

...
>>> timezone.get_current_timezone_name()
'Asia/Kolkata'

来自django文档

now():

返回表示当前时间点的日期时间。返回的确切内容取决于USE_TZ的值:

  • 如果USE_TZ为False,则将返回一个简单的日期时间(即没有关联时区的日期时间),该日期时间表示系统本地时区中的当前时间。

  • 如果USE_TZ为True,则将返回一个代表UTC中当前时间的知情日期时间。请注意,现在(now)将始终返回UTC时间,而不管TIME_ZONE的值如何;您可以使用localtime()将其转换为当前时区的时间。

因此,如果您的系统本地时区为“Asia/Kolkata”,则可以在settings.py中将USE_TZ设置为False,并且timezone.now()将返回您想要的结果。

或者,您需要使用localtime()将时区转换为您的时区(继续使用您的shell结果):
...
>>> import datetime
>>> utc_date = datetime.datetime.utcnow()
>>> aware_date = timezone.make_aware(utc_date, timezone.utc)
>>> timezone.localtime(aware_date, timezone.get_current_timezone())
datetime.datetime(2014, 12, 17, 8, 0, 36, 598113, tzinfo=<DstTzInfo 'Asia/Kolkata' IST+5:30:00 STD>)

最后, 这里make_aware() 函数的文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接