【发布时间】:2012-01-28 00:51:24
【问题描述】:
我有一个 Django 应用程序,其模型包含 DateTimeField 类型的字段。
我正在以2008-04-10 11:47:58-05 的格式从网上提取数据。
我相信这个例子中的最后 3 个字符是时区。
如何在 DateTimeField 中保留该数据,两者之间是否可以轻松转换?将 DateTimeField 设置为仅包含上述格式的字符串会引发 ValidationError。
谢谢!
【问题讨论】:
我有一个 Django 应用程序,其模型包含 DateTimeField 类型的字段。
我正在以2008-04-10 11:47:58-05 的格式从网上提取数据。
我相信这个例子中的最后 3 个字符是时区。
如何在 DateTimeField 中保留该数据,两者之间是否可以轻松转换?将 DateTimeField 设置为仅包含上述格式的字符串会引发 ValidationError。
谢谢!
【问题讨论】:
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")
【讨论】:
您也可以使用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
【讨论】:
from django.utils import timezone, dateparse; timezone.is_aware(dateparse.parse_datetime('2015-09-04 19:22:17')),还可以在source 中看到返回的 datetime.datetime。
我一直在用这个:
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'))
【讨论】:
你可以使用
import dateutil.parser
dateutil.parser.parse('2008-04-10 11:47:58-05')
它返回一个日期时间(可以分配给 DateTimeField)。
【讨论】:
dateutil 是第三方模块(请参阅 PyPI 上的 python-dateutil),默认情况下您可能没有安装。
如果您使用的是 Django 表单,则可以将 input_formats 指定为您的 DateField。见DateField documentation
如果您想解析任意日期信息,您可以使用parsedatetime 之类的东西,并实现一个Django 调用的方法,以便在它到达验证器之前进行解析。 (请参阅this SO answer,了解验证的工作原理以及何时插入它们)
【讨论】: