3

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

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 转换为 datetime,然后才能将 datetime 对象转换为第四行中的 datetime-aware 对象(支持时区)。

专家有什么建议吗?

谢谢

更新:

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]
4

2 回答 2

9

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

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 的一个实例,它有一个名为 的 DateTimeField date_time

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

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

如果将对strptime和的调用组合在localize一行上,则在分配到之前完成从幼稚datetime转换为非幼稚的完整计算,因此在这种情况下您不会收到错误。datetimedate_time

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

于 2013-01-29T12:45:44.350 回答
0

您是否在设置文件中打开了 USE_TZ?

USE_TZ = True

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

于 2013-01-21T22:48:43.833 回答