【问题标题】:Django: How to make a datetime object aware of the timezone in which it was created?Django:如何让 datetime 对象知道创建它的时区?
【发布时间】: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)

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

【问题讨论】:

标签: python django datetime django-models timezone


【解决方案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())
    

    【讨论】:

    • 添加一些解释肯定会对大家有所帮助。
    • 第一行他选择时区,第二行将日期转换为当地时区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    相关资源
    最近更新 更多