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

Posted

技术标签:

【中文标题】Django:如何让 datetime 对象知道创建它的时区?【英文标题】:Django: How to make a datetime object aware of the timezone in which it was created? 【发布时间】:2014-04-02 06:00:41 【问题描述】:

我正在运行一个从远程服务器请求海潮数据的程序。这个潮汐数据的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)

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

【问题讨论】:

Get the Olson TZ name for the local timezone?的可能重复 具体见tzlocal,我提到了here “基于我机器的本地时区”——这就是问题所在。不要使用您的本地时区,而是使用 UTC 时区或 POSIX 时间戳。如果你想;您可以存储您的本地时间除了到UTC时间。见Daylight saving time and time zone best practices。 【参考方案1】:

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

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

如果您确实需要按照您的描述手动创建它,请按照here 的用法或使用make_aware()

from django.utils.timezone import make_aware

naive = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)
aware = make_aware(naive, timezone=pytz.timezone("Europe/Helsinki"))
# can leave off the timezone parameter if converting to the current timezone

current timezone 将是默认时区(由 TIME_ZONE 设置定义),除非您使用 activate() 指定不同的时区。默认时区可能与服务器的系统时区相同,也可能不同。以pytz 可以理解的格式获取系统时区在this answer 中进行了讨论。

最后,正如here 所讨论的那样,确保用户看到转换为当地时区的时间并非易事:

当前时区相当于翻译的当前语言环境。但是,Django 无法使用 Accept-Language HTTP 标头来自动确定用户的时区。相反,Django 提供了时区选择功能。使用它们来构建对您有意义的时区选择逻辑。

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

【讨论】:

【参考方案2】:
from django.utils import timezone
import pytz

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

【讨论】:

添加一些解释肯定会对大家有所帮助。 第一行他选择时区,第二行将日期转换为当地时区。

以上是关于Django:如何让 datetime 对象知道创建它的时区?的主要内容,如果未能解决你的问题,请参考以下文章

Django:模型对象保存中的 datetime.now() 时间不一致

Django - 上一小时的所有对象

Django Max DateTime 聚合

java中如何让datetime转换成date类型

如何使用 update() 在 Django 中的日期时间字段上增加年份?

如何让 django 知道模板目录?