繁体   English   中英

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

[英]Django: How to make a datetime object aware of the timezone in which it was created?

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

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

在将datetime对象发布到Django之前,如何确保datetime对象知道它是基于本地时区创建的?

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

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

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

首先,确保您熟悉Django 关于时区文档 ,设置USE_TZ = True ,然后安装pytz

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

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

from django.utils.timezone import make_aware

naive = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)
make_aware(naive)  # current timezone, or...
make_aware(naive, timezone=pytz.timezone("Europe/Helsinki"))  # ...specific timezone

除非您使用activate()指定其他时区,否则当前时区将是默认时区(由TIME_ZONE设置定义)。 默认时区可能与服务器的系统时区相同,也可能不同。 这个答案中讨论了以pytz可以理解的格式获取系统时区。

最后,确保用户所看到的时间转换为当地时区是不平凡的,因为讨论在这里

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

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

from django.utils import timezone
import pytz

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM