【问题标题】:How to solve the strptime() caused naive datetime RuntimeWarning?如何解决 strptime() 导致的幼稚 datetime RuntimeWarning?
【发布时间】:2013-01-05 00:20:50
【问题描述】:

我正在尝试编写代码而不在控制台中抛出任何警告。到目前为止,我一直很擅长避免这种情况,直到发生这种情况,这对我来说似乎是先有鸡还是先有蛋的情况。

from datetime import datetime as dt 

last_contacted = "19/01/2013"
current_tz = timezone.get_current_timezone()
date_time = dt.strptime(last_contacted, get_current_date_input_format(request))
date_time = current_tz.localize(date_time)

第三行抛出这个警告:

RuntimeWarning:DateTimeField 收到一个天真的日期时间 (2013-01-19 00:00:00)同时时区支持处于活动状态。)

有点奇怪,因为我需要先将 unicode 转换为日期时间,然后才能在第四行将日期时间对象转换为日期时间感知对象(支持时区)。

专家有什么建议吗?

谢谢

更新:

def get_current_date_input_format(request):
    if request.LANGUAGE_CODE == 'en-gb':
        return formats_en_GB.DATE_INPUT_FORMATS[0]
    elif request.LANGUAGE_CODE == 'en':        
        return formats_en.DATE_INPUT_FORMATS[0]

【问题讨论】:

  • 你的“dt”变量是什么?
  • 更新问题,from datetime import datetime as dt
  • 还需要查看get_current_date_input_format 函数的来源...
  • 此 RuntimeWarning 仅在您将天真日期时间对象分配给 Model 实例时发生,因此您显示的示例代码不应发出此警告,除非 get_current_date_input_format 正在做一些特殊的事情。
  • 谢谢,我已经用请求的信息更新了问题。我注意到如果我将第 3 行和第 4 行结合起来,我根本不会收到警告。多么奇怪..

标签: python django


【解决方案1】:

您是否在您的 settings 文件中打开了 USE_TZ?

USE_TZ = True

此外,您可以从documentation 采取一些更具体的步骤。

【讨论】:

    【解决方案2】:

    从 cmets 到您的问题,我猜您的代码中真正拥有的是这样的:

    from datetime import datetime as dt 
    
    last_contacted = "19/01/2013"
    current_tz = timezone.get_current_timezone()
    model_instance.date_time = dt.strptime(last_contacted, get_current_date_input_format(request))
    model_instance.date_time = current_tz.localize(date_time)
    

    其中model_instance 是 Model 的一个实例,它有一个名为 date_time 的 DateTimeField。

    class MyModel(models.Model)
        ....
        date_time = DateTimeField()
    

    Python datetime.strptime 函数返回一个幼稚的 datetime 对象,您尝试将其分配给 DateTimeField,然后生成警告,因为在时区支持时使用非幼稚的 datetime 对象不正确已启用。

    如果您在一行中组合对strptimelocalize 的调用,则在分配给date_time 之前完成从幼稚datetime 转换为非幼稚datetime 的完整计算等在这种情况下,您不会收到错误消息。

    附加说明:如果请求中没有时区,您的get_current_date_input_format 函数应返回一些默认时区,否则strptime 调用将失败。

    【讨论】:

    • current_tz.localize(...)(或 utc.localize(...))是这里的关键。
    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    相关资源
    最近更新 更多