frn*_*nhr 12 python django django-timezone
我有一个带有DateTimeField的模型:
deadline = models.DateTimeField(verbose_name="Valid unitl", null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
应允许用户在现场输入日期,时间和时区信息.这是我想要的格式:
2012-12-31 23:30 +0430
Run Code Online (Sandbox Code Playgroud)
我希望在存储到db之前将时间转换为UTC.所以我尝试使用模型表单,但Enter a valid date/time.如果输入上面的值,它会在该DateTimeField上抛出验证错误.
这是在settings.py中:
DATE_INPUT_FORMATS = ('%Y-%m-%d %H:%M %Z', )
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
编辑:
根据ВидулПетров的建议,尝试使用表单字段:
deadline2 = forms.DateTimeField(input_formats=['%Y-%m-%d %H:%M %Z',],
Run Code Online (Sandbox Code Playgroud)
得到了同样的效果: Enter a valid date/time.
编辑2
看来datetime无法处理"%z"参数.这会抛出一个ValueError:
datetime.datetime.strptime(value, format)
Run Code Online (Sandbox Code Playgroud)
所以我在控制台中测试了它:
>>> import datetime
>>> datetime.datetime.strptime('2012-12-30 19:00 +0100', "%Y-%m-%d %H:%M %z")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M %z'
Run Code Online (Sandbox Code Playgroud)
还试过pytz:
>>> import pytz
>>> pytz.datetime.datetime.strptime('2012-12-30 19:00 +0100', "%Y-%m-%d %H:%M %z")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
(bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M %z'
Run Code Online (Sandbox Code Playgroud)
我觉得这应该有效.我是否错过了其他一些文档?
小智 15
当您USE_TZ = True在设置中进行设置时,Django会在数据库中以UTC格式存储日期和时间信息,否则它将存储天真的日期时间(没有时区的日期时间).
在大多数情况下,使用Django的时区支持非常方便,因为输入和输出日期时间将由Django自动转换.
但是如果您真的需要来自用户的时区输入,则需要设置USE_TZ = False然后使用DateTimeField这个天真的日期时间以及CharField将时区信息存储在models.py中.
ref:https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/
| 归档时间: |
|
| 查看次数: |
21472 次 |
| 最近记录: |