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 【问题描述】:我正在运行一个从远程服务器请求海潮数据的程序。这个潮汐数据的time
和date
是根据我机器的本地时区计算的。我想使用这些本地日期和时间创建一个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() 时间不一致