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

虽然当我将它保存为一个简单的字符串时,它会保存在当前时区,即“亚洲/加尔各答”输出为字符串:2014-12-17 11:01:53.028852+05:30

4

1 回答 1

4

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

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

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

django 文档

现在():

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

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

  • 如果 USE_TZ 为 True,这将是一个以 UTC 表示当前时间的感知日期时间。请注意,无论 TIME_ZONE 的值如何, now() 都将始终返回 UTC 时间;您可以使用 localtime() 转换为当前时区的时间。

因此,如果您系统的本地时区是“亚洲/加尔各答”,您可以在您的中设置USE_TZ,然后返回您想要的。Falsesettings.pytimezone.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()是函数的文档

于 2014-12-17T02:20:17.177 回答