【问题标题】:How can I make django model datetime field data of midnight and timezone aware?如何使 django 模型日期时间字段数据了解午夜和时区?
【发布时间】:2016-02-08 05:16:12
【问题描述】:

我正在尝试在我的 django 模型中将expire_time 设置为用户选择的日期的午夜,并了解时区。但我无法正确获得它。谁能告诉我该怎么做或者我的代码哪里出错了?

我的代码是,

date = datetime.strptime(str(request.POST.get('expire') + ', 23:59:59'),
                                     '%Y-%m-%d, %H:%M:%S')
            tz = timezone.get_current_timezone()
            date_tz = tz.localize(date)
            createEventInDB.ev_expire = date_tz

            try:
                createEventInDB.save()

            except Exception as e:
                error = e

因此,如果我选择 2015 年 12 月 1 日的日期,它将发布为 2015-12-1

我想将数据保存在像2015-12-01 23:59:59 这样的数据库中。我想给用户一整天。我当前的时区是美国/芝加哥。我已经通过 ip 设置了活动时区。所以我想让它像用户可以从任何地方发布,但时区必须是 UTC 感知并在午夜过期。谁能告诉我怎样才能使它成为可能?

【问题讨论】:

  • 你怎么知道你的代码错了?

标签: python django date datetime


【解决方案1】:

基于https://docs.djangoproject.com/en/1.8/topics/i18n/timezones/的文档

启用时区支持后,Django 以 UTC 格式将日期时间信息存储在数据库中,在内部使用可识别时区的日期时间对象,并在模板和表单中将它们转换为最终用户的时区。

所以这一切都是完全没有必要的,您只需像往常一样使用models.DateTimeField

您可以在视图或表单中定义一个Date 小部件,然后在保存之前将DateTimeFieldTime 更改为23:59:59(或者您可以将其作为默认值提供),Django 将自动转换保存前将其转换为 UTC。

【讨论】:

  • 这是错误的:"alter Time of DateTimeField later on to 23:59:59 before save" -- 如果给定时间和午夜使用不同的 UTC 偏移量(例如,它们跨越 DST 转换),然后由于未标准化的输入(如果您在其上调用 tz.normalize(),则不再对应于午夜),您会得到错误的 UTC 时间。见How do I get the UTC time of “midnight” for a given timezone?
  • 两种解决方案都有帮助,但我想做的是数据库中的2015-12-01 23:59:59 utc。所以用户有整个 12 月 1 日。或者我可以做的是2015-12-02 00:00:00 utc
  • @J.F.Sebastian 感谢您的链接,它很有帮助。 (而且你的用户名也很棒。)
【解决方案2】:

我想做的是 2015-12-01 23:59:59 UTC

您在问题中的代码返回23:59:59 在当前时区

返回“23:59:59 UTC”更简单,而不是给定相应的 UTC 日期:

from datetime import datetime
import pytz

ev_expire = datetime(utc_date.year, utc_date.month, utc_date.day, 23, 59, 59,
                     tzinfo=pytz.utc)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2021-10-04
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    相关资源
    最近更新 更多