【问题标题】:Django: How-to convert naive datetime when time zone support is active?Django:如何在时区支持处于活动状态时转换天真的日期时间?
【发布时间】:2016-08-28 18:15:47
【问题描述】:

我正在为 Django 和日期时间而苦苦挣扎。

我有一个日期时间字符串,如“Sun, 28 Aug 2016 11:42:00 +0200” - 所以从我的角度来看,包括时区信息“+0200”

然后我用这个转换它:

date_published = time.strptime(date_published, "%a, %d %b %Y %H:%M:%S %z")

它给了我这个:

time.struct_time(tm_year=2016, tm_mon=8, tm_mday=28, tm_hour=11, tm_min=42, tm_sec=0, tm_wday=6, tm_yday=241, tm_isdst=-1)

然后我尝试像这样转换它:

date_published = datetime.fromtimestamp(time.mktime(date_published))

这给了我:

2016-08-28 11:42:00

然后 Django 在保存时抱怨以下警告:

RuntimeWarning: DateTimeField ModelName.field_name received a naive
datetime (2012-01-01 00:00:00) while time zone support is active.

如何正确转换输入字符串,以便将其保存到时区感知日期时间模型的字段中?

最好的问候

凯夫

【问题讨论】:

  • Django 抛出什么错误?向我们展示您的模型。
  • 我添加了警告信息。

标签: django datetime data-aware


【解决方案1】:

Python 本身无法处理时区。你需要外部库来做到这一点。例如dateutil:

from dateutil.parser import parse
dt = parse("Sun, 28 Aug 2016 11:42:00 +0200")

【讨论】:

    【解决方案2】:

    仅此一项即可:

    from datetime import datetime
    date_published = datetime.strptime(date_published, "%a, %d %b %Y %H:%M:%S %z")
    

    我得到的回报是datetime.datetime(2016, 8, 28, 11, 42, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

    【讨论】:

    • 酷 - 就是这样!我的问题是我使用“时间”而不是“日期时间”
    猜你喜欢
    • 2014-12-03
    • 2020-06-19
    • 2019-07-23
    • 2016-10-03
    • 2017-12-05
    • 2012-07-18
    • 2020-09-19
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多