django DateTimeField with UTC offset?

一世执手 提交于 2020-01-12 06:54:27

问题


I have a model with a DateTimeField:

deadline = models.DateTimeField(verbose_name="Valid unitl", null=True, blank=True)

Users should be allowed to input date, time and timezone info in the field. This is my desired format:

2012-12-31 23:30 +0430

I expect the time will get converted to UTC before storing to db. So I tried using a model form for that, but it throws Enter a valid date/time. validation error on that DateTimeField if I enter the value above.

This is in settings.py:

DATE_INPUT_FORMATS = ('%Y-%m-%d %H:%M %Z', )

What am I missing?

Edit:

As per Видул Петров's suggestion, tried to use a form field:

deadline2 = forms.DateTimeField(input_formats=['%Y-%m-%d %H:%M %Z',],

Got the same effect: Enter a valid date/time.

Edit 2

It appears that datetime can't handle the "%z" parameter. This throws a ValueError:

datetime.datetime.strptime(value, format)

So I tested it in console:

>>> 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'

Also tried 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'

I really feel this should work. Did I miss some part of the docs that says otherwise?


回答1:


When you set USE_TZ = True in your settings, Django stores date and time information in UTC in the database otherwise it will store naive date time (date time without timezone).

In most cases using Django's time zones support is very convenient because input and output datetime will be automatically translate by Django.

But if you really need timezone input from your user, you will need to set USE_TZ = False then use DateTimeField which is naive datetime along with CharField to store timezone information in your models.py.

ref: https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/



来源:https://stackoverflow.com/questions/14074696/django-datetimefield-with-utc-offset

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!