Django:如何让datetime对象知道它的创建时区?

时间:2014-03-01 00:55:46

标签: python django datetime django-models timezone

我正在运行一个从远程服务器请求海潮数据的程序。此潮汐数据的timedate是根据我机器的本地时区计算的。我想使用这些本地日期和时间来创建一个datetime对象,然后我将保存在Django模型中。

datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)

在将datetime对象发布到Django之前,如何确保datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute, loc_timezone) 对象知道它是基于本地时区创建的?

我想,在发布之前我希望它看起来像这样:

{{1}}

如何动态获取本机的本地时区?以及如何确保所有用户都将时间转换为他们自己的本地时区。

2 个答案:

答案 0 :(得分:35)

首先,确保您熟悉Django的documentation on timezones,设置USE_TZ = True,并安装pytz

我不太明白你的约会对象来自哪里。如果它来自服务器作为其数据的一部分(即它表示测量潮汐时),它应该已经是UTC,或者您需要知道它们正在使用的时区。如果您正在创建它,那么最简单的方法就是在创建模型实例时使用django.utils.timezone.now()(返回时区感知日期时间)。

如果您确实需要按照自己的描述手动创建,请按照使用情况here进行操作:

import pytz
datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)
pytz.timezone("Europe/Helsinki").localize(datetime_obj)

您可以使用django.utils.timezone.get_default_timezone_name()获取默认时区,而不是“欧洲/赫尔辛基”。这将是您使用TIME_ZONE设置定义的时区,可能不是实际的系统时区。 this answer中讨论了以pytz可以理解的格式获取系统时区。

最后,确保用户看到转换为当地时区的时间非常重要,正如here所述:

  

当前时区相当于当前翻译的区域设置。但是,没有相当于Django可以用来自动确定用户时区的Accept-Language HTTP标头。相反,Django提供时区选择功能。使用它们来构建对您有意义的时区选择逻辑。

请参阅那里的例子以获得指导。

答案 1 :(得分:5)

from django.utils import timezone
import pytz

timezone.activate(pytz.timezone("Asia/Kolkata"))
timezone.localtime(timezone.now())