Django:activate()没有显示效果

时间:2014-12-17 02:06:23

标签: python django django-timezone

我在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 on Mongolab)上时,它会保存为UTC 我的数据库中有DateTimeField

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

1 个答案:

答案 0 :(得分:3)

它实际上成功地将当前时区设置为“Asia / Kolkata”

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

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

来自django documentation

  

现在():

     

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

     
      
  • 如果USE_TZ为False,则这将是一个天真的日期时间(即日期时间)   没有相关的时区)表示当前时间   系统的本地时区。

  •   
  • 如果USE_TZ为True,则会知道这一点   datetime表示UTC的当前时间。请注意 now()将会   无论TIME_ZONE的值是什么,总是以UTC为单位返回时间;您   可以使用localtime()转换为当前时区的时间。

  •   

因此,如果您系统的本地时区是“亚洲/加尔各答”,则可以在USE_TZ中将False设置为settings.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>)

最后,heremake_aware()函数

的文档