关于python:如何解决strptime()引起的天真日期时间RuntimeWarning?

How to solve the strptime() caused naive datetime RuntimeWarning?

我试图在不向控制台发出任何警告的情况下进行编码。到目前为止,我一直很擅长避免这种情况,直到这一次,在我看来,这就像一个鸡蛋和鸡的情况。

1
2
3
4
5
6
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 received a naive datetime (2013-01-19
00:00:00) while time zone support is active.)

这有点奇怪,因为我需要先将Unicode转换为datetime,然后才能在第四行将datetime对象转换为支持datetime的对象(支持时区)。

专家有什么建议吗?

谢谢

更新:

1
2
3
4
5
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]


从评论到您的问题,我猜想您的代码中真正包含的内容如下:

1
2
3
4
5
6
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是具有名为date_time的日期时间字段的模型的实例。

1
2
3
class MyModel(models.Model)
    ....
    date_time = DateTimeField()

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

如果您将对strptimelocalize的调用合并在一行上,那么在分配给date_time之前就完成了从naive datetime转换为非naive datetime的完整计算,因此在这种情况下不会出现错误。

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


你打开设置文件中的"使用"了吗?

1
USE_TZ = True

此外,从文档中可以采取一些更具体的步骤。