我正在尝试在Django中编写一个页面,该页面使用JavaScript获取某个任务的开始和结束时间,并使用AJAX进行POST。由于JavaScript似乎没有很好的格式化日期的方法,我发送的只是发送一个类似Fri May 13 2016 22:00:56 GMT-0600 (MDT)
的日期字符串,由Python解析为字符串。
这是我解析字符串的函数:
def get_js_date(string):
date = datetime.datetime.strptime(string, '%a %b %d %Y %H:%M:%S GMT%z (%Z)')
return date.strftime("%Y-%m-%d %H:%M:%S %Z")
视图使用它如下:
def review_new(request):
if request.method == 'POST':
review = Review(
user = request.user,
start = get_js_date(request.POST.get('start')),
finish = get_js_date(request.POST.get('finish'))
)
review.save()
当我在Python REPL中导入函数时,它可以正常工作:
>>> from checks.utilities import get_js_date
>>> get_js_date('Fri May 13 2016 22:00:56 GMT-0600 (MDT)')
'2016-05-13 22:00:56 MDT'
但是,当我通过./manage.py shell
运行时,它会中断:
>>> from checks.utilities import get_js_date
>>> get_js_date('Fri May 13 2016 22:00:56 GMT-0600 (MDT)')
Traceback (most recent call last):
File "/home/phin/virtualenvs/testenv/lib/python3.5/site-packages/django/core/management/commands/shell.py", line 69, in handle
self.run_shell(shell=options['interface'])
File "/home/phin/virtualenvs/testenv/lib/python3.5/site-packages/django/core/management/commands/shell.py", line 61, in run_shell
raise ImportError
ImportError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/phin/grappleshark/checks/utilities.py", line 4, in get_js_date
date = datetime.datetime.strptime(string, '%a %b %d %Y %H:%M:%S GMT%z (%Z)')
File "/usr/lib64/python3.5/_strptime.py", line 500, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "/usr/lib64/python3.5/_strptime.py", line 337, in _strptime
(data_string, format))
ValueError: time data 'Fri May 13 2016 22:00:56 GMT-0600 (MDT)' does not match format '%a %b %d %Y %H:%M:%S GMT%z (%Z)'
关于Django环境的一些东西似乎打破了一切,我似乎无法找到它是什么。我错过了一些明显的东西吗任何建议将不胜感激。
答案 0 :(得分:1)
我认为你在Python中遇到this bug:
%Z的文档说它与
MDT
相匹配,但实际上并没有。
在线程中,有人指出:
查看代码,它识别的唯一时区字符串是utc,gmt,以及time.tzname(EST和EDT,在我的情况下)中的任何内容。
(这可能就是为什么它在REPL中适合你。)
datetime.datetime.strptime('Fri May 13 2016 22:00:56 GMT-0600',
'%a %b %d %Y %H:%M:%S GMT%z')
时区名称是导致其失败的原因。您可以通过剥离来确认这一点。尝试在Django shell中运行它,它将起作用:
from dateutil import parser
parser.parse('Fri May 13 2016 22:00:56 GMT-0600 (MDT)')
可能的解决方案:在尝试解析时删除时间字符串的最后一部分;或使用效果良好的dateutil:
int randomnumbers = rand();