【问题标题】:received a naive datetime while time zone support is active在时区支持处于活动状态时收到一个天真的日期时间
【发布时间】:2019-07-23 04:51:25
【问题描述】:

我正在尝试向 Django 模型插入一些记录,其中包括一些 unix ctime 格式的旧日期。我将其转换为 YYYY-MM-DD hh:mm:ss 并将其保存到日期时间字段中的模型中。

在运行导入作业(将 unix 日期转换为 YYYY-MM-DD hh:mm:ss 的函数)并保存时,我在下方收到警告

C:\Python\Python36\lib\site-packages\django\db\models\fields\__init__.py:1421: RuntimeWarning: DateTimeField SensorRecords.aqdate received a naive datetime (2012-07-06 05:00:00) while time zone support is active.
  RuntimeWarning)

我应该如何导入它以避免这种情况?

这是我的转换器函数

def ctodatetime (ctimeinput):
    etime=time.ctime(int(ctimeinput))
    btime=datetime.datetime.strptime(etime,"%a %b %d %H:%M:%S %Y")
    print(btime)
    return btime

这是我的模型的 sn-p

class SensorRecords(models.Model):
    sensorid  = models.IntegerField(default=0)
    aqdate    = models.DateTimeField(default= "1970-01-01 00:00:00")
    cmpflaf   = models.BooleanField(default=0)

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    在传递给模型实例之前,您应该将 tz_info 添加到 datetime 对象。

    import pytz
    import datetime
    import time
    from django.conf import settings
    
    
    def ctodatetime(ctimeinput):
        etime = time.ctime(int(ctimeinput))
        btime = datetime.datetime.strptime(etime, "%a %b %d %H:%M:%S %Y")
        tz_aware_datetetime = btime.replace(tzinfo=pytz.timezone(settings.TIME_ZONE))
        print(tz_aware_datetetime)
        return tz_aware_datetetime


    .replace() 函数返回一个新的日期时间对象

    有关更多信息,请参阅此 SO 帖子 RuntimeWarning: DateTimeField received a naive datetime

    【讨论】:

    • 感谢@jpg 的帮助,但它仍然显示相同的警告和相同格式的打印日期。我会阅读您发送的链接。
    【解决方案2】:

    特定于 Django 的解决方案可以使用django.utils.timezone,方式如下:

    from datetime import datetime
    from django.utils import timezone
    from django.conf import settings
    
    def ctodatetime(ctimeinput):
        etime = time.ctime(int(ctimeinput))
        btime = datetime.strptime(etime, "%a %b %d %H:%M:%S %Y")
        tz = getattr(settings, 'TIME_ZONE', None)
        return timezone.make_aware(btime, tz)
    

    这依赖于 btime 将是一个简单的时间戳这一事实,并利用 Django 的 make_aware() 将其转换为可识别时区的时间戳。

    【讨论】:

      猜你喜欢
      • 2020-06-19
      • 2016-10-03
      • 2014-12-03
      • 1970-01-01
      • 2012-07-18
      • 2020-09-19
      • 2020-10-13
      • 1970-01-01
      • 2017-12-05
      相关资源
      最近更新 更多