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

sga*_*a62 21 python django timezone datetime django-models

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

datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)
Run Code Online (Sandbox Code Playgroud)

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

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

datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute, loc_timezone)
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*nry 42

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

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

如果你真的需要手动创建为你所描述,按照使用这里:

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
Run Code Online (Sandbox Code Playgroud)

而不是"欧洲/赫尔辛基",您可以获得默认时区make_aware().这将是您使用TIME_ZONE设置定义的时区,可能不是实际的系统时区.activate()此答案中讨论了以可理解的格式获取系统时区.

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

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

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

  • @CornelCiobanu:不,只是“is_dst”参数已被弃用。 (2认同)

Him*_*der 5

from django.utils import timezone
import pytz

timezone.activate(pytz.timezone("Asia/Kolkata"))
timezone.localtime(timezone.now())
Run Code Online (Sandbox Code Playgroud)

  • 添加一些解释肯定会帮助每个人. (11认同)