将日期时间字符串解析为Django DateTimeField

use*_*786 31 django format datetime

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

谢谢!

Mel*_*vyn 74

您也可以使用Django的实现.我实际上更喜欢它,只使用其他东西,如果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>)
Run Code Online (Sandbox Code Playgroud)

要在无人知晓的情况下将其转换为正确的时区,请使用make_aware django.utils.timezone.

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

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
Run Code Online (Sandbox Code Playgroud)

  • 不过,我确实希望文档准确地指定“格式良好”的日期是什么!我希望这意味着 RFC 1123,但它似乎不喜欢我的浏览器发回的内容...... (2认同)
  • @TheCardCheat 你是对的,它没有 make_aware() (github 告诉我它从来没有,但我使用的代码在某处意识到了)。但是,如果输入字符串包含可识别的时区偏移量,则它*确实* 返回一个已知的日期时间。 (2认同)

nis*_*isc 43

您可以使用

import dateutil.parser
dateutil.parser.parse('2008-04-10 11:47:58-05')
Run Code Online (Sandbox Code Playgroud)

返回日期时间(可以分配给DateTimeField).

  • 请注意,`dateutil`是第三方模块(参见PyPI上的[python-dateutil](http://pypi.python.org/pypi/python-dateutil/)),默认情况下可能没有安装. (19认同)

Pau*_*lin 12

我一直在用这个:

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'))
Run Code Online (Sandbox Code Playgroud)


小智 6

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

例如。对于字符串格式的值 (2016-10-03T19:00:00.999Z),它可以转换为 Django datetime 对象,如下所示:

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")
Run Code Online (Sandbox Code Playgroud)