【问题标题】:Parsing a Datetime String into a Django DateTimeField将日期时间字符串解析为 Django DateTimeField
【发布时间】:2012-01-28 00:51:24
【问题描述】:

我有一个 Django 应用程序,其模型包含 DateTimeField 类型的字段。
我正在以2008-04-10 11:47:58-05 的格式从网上提取数据。
我相信这个例子中的最后 3 个字符是时区。
如何在 DateTimeField 中保留该数据,两者之间是否可以轻松转换?将 DateTimeField 设置为仅包含上述格式的字符串会引发 ValidationError。

谢谢!

【问题讨论】:

    标签: django datetime format


    【解决方案1】:

    Django DateTimeField 的字符串格式为“%Y-%m-%dT%H:%M:%S.%fZ”。 因此,可以使用 strptime() 或 strptime() 使用这种格式来完成彼此之间的转换。

    例如。对于字符串格式的值(2016-10-03T19:00:00.999Z),可以转换 以 Django 日期时间对象为:

    from datetime import datetime
    
    datetime_str = '2016-10-03T19:00:00.999Z'
    
    datetime_object = datetime.strptime(datetime_str, "%Y-%m-%dT%H:%M:%S.%fZ")
    

    【讨论】:

      【解决方案2】:

      您也可以使用Django's implementation。事实上,如果 Django 的解析器无法处理该格式,我会更喜欢它并且只使用其他东西。

      例如:

      >>> from django.utils.dateparse import parse_datetime
      >>> parse_datetime('2016-10-03T19:00:00')
      datetime.datetime(2016, 10, 3, 19, 0)
      >>> parse_datetime('2016-10-03T19:00:00+0200')
      datetime.datetime(2016, 10, 3, 19, 0, tzinfo=<django.utils.timezone.FixedOffset object at 0x8072546d8>)
      

      要在不知道时区的情况下将其转换为正确的时区,请使用来自django.utils.timezone 的 make_aware。

      所以最终,您的解析器实用程序将是:

      from django.utils.dateparse import parse_datetime
      from django.utils.timezone import is_aware, make_aware
      
      def get_aware_datetime(date_str):
          ret = parse_datetime(date_str)
          if not is_aware(ret):
              ret = make_aware(ret)
          return ret
      

      【讨论】:

      • 我当然希望文档准确地指定“格式正确”的日期是什么!我希望这意味着 RFC 1123,但它似乎不喜欢我的浏览器发回的内容......
      • 这个答案不正确,因为没有返回时区感知日期时间,至少在 1.8.4 中没有。您可以自己尝试一下from django.utils import timezone, dateparse; timezone.is_aware(dateparse.parse_datetime('2015-09-04 19:22:17')),还可以在source 中看到返回的 datetime.datetime。
      • @TheCardCheat 你是对的,它没有 make_aware() (github 告诉我它从来没有这样做过,但我使用的代码在某处意识到了)。但是,如果输入字符串包含可识别的时区偏移量,则它确实返回一个感知日期时间。
      【解决方案3】:

      我一直在用这个:

      from django.utils.timezone import get_current_timezone
      from datetime import datetime
      tz = get_current_timezone()
      dt = tz.localize(datetime.strptime(str_date, '%m/%d/%Y'))
      

      【讨论】:

        【解决方案4】:

        你可以使用

        import dateutil.parser
        dateutil.parser.parse('2008-04-10 11:47:58-05')
        

        它返回一个日期时间(可以分配给 DateTimeField)。

        【讨论】:

        • 这听起来不错,但在我的 python 2.6.5 中没有 datetime.parser 或 datetime.datetime.parser 模块(我得到一个 ImportError)。我错过了什么?
        • 请注意,dateutil 是第三方模块(请参阅 PyPI 上的 python-dateutil),默认情况下您可能没有安装。
        • 完美,谢谢!它找出了我的字符串日期格式,非常节省时间。
        • 我如何解析 '1990 年 11 月 1 日' 到目前为止,先生,我是 python 新手?
        【解决方案5】:

        如果您使用的是 Django 表单,则可以将 input_formats 指定为您的 DateField。见DateField documentation

        如果您想解析任意日期信息,您可以使用parsedatetime 之类的东西,并实现一个Django 调用的方法,以便在它到达验证器之前进行解析。 (请参阅this SO answer,了解验证的工作原理以及何时插入它们)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-01
          • 1970-01-01
          • 2019-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多