2016-01-22 4 views
1

ISO 8601? Например, Джанго хорошо с этим форматом:Какой формат даты использовать при работе с Android и django?

ValidationError at /locations/new_tracks/1351320785 
["'1351320785' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."] 

Или UnixTime? Для меня важно иметь часовой пояс. Запрашиваю, потому что у меня нет опыта работы с серверно-клиентскими системами, написанными в двух разных рамках.

+0

Я не понимаю, почему вы представляете 'ValidationError' в качестве доказательства: *« django хорош с этим форматом »*. (это указывает на противоположное, что код не понимает формат) – jfs

+0

Я накормил его unixtime, и он отказался, сказав, что он должен быть в формате ГГГГ-ММ-ДД ЧЧ: ММ [: ss [.uuuuuu]] [TZ]. ], который является 8601 –

ответ

1

Django почти всегда хранит даты в UTC, используя поле базы данных соответствующего типа даты/времени для базовой базы данных. Вы не можете получить доступ к этому напрямую - при чтении/записи базы данных он будет преобразован в/из объекта «datetime» Python, подробно описанного in the Python docs. Преобразование между временем Unix (в частности, время POSIX, указанное в терминах UTC) и датами времени Python в UTC, является простым с использованием datetime.datetime.utcfromtimestamp и time.mktime(t.timetuple()). Преобразование между датами времени Python и ISO 8601 может быть выполнено с помощью the iso8601 package.

Если вам нужно поддерживать дату и время локального часового пояса, даже если это всего лишь один местный часовой пояс, вы должны включить поддержку часового пояса, как указано в the Django time zones documentation. Это добавит сложности, но, как отмечается в документации, «это защищает вас от тонких и невоспроизводимых ошибок в переходах на летнее время (DST)».

+0

Время Unix не указано в UTC. Это не в любой временной зоне. Хотя вы можете конвертировать «секунды с эпохи» в UTC время на POSIX легко ('utc_time = datetime (1970, 1, 1) + timedelta (seconds = timestamp) '). – jfs

+0

POSIX.1-2008 [указывает] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15), что время эпохи соответствует UTC, а не считая секунды прыжка - вот что я имел в виду по времени Unix здесь, хотя некоторые системы могут использовать немного другую семантику. –

+0

Вы понимаете разницу между «всегда UTC» и «конвертировать .. легко»? Тот факт, что вы можете ' t представляет некоторое действительное время UTC как «время эпохи», однозначно намекает, что «is» здесь не подходит. S ee [Вернет ли время Python time.time() вернуть временную метку локального или UTC?] (http://stackoverflow.com/a/20035913/4279) – jfs

0

сообщение об ошибке прямо говорит, что формат, который вы должны использовать:

Он должен быть в YYYY-MM-DD HH: MM [: сс [.uuuuuu]] [TZ] формат.

Если все у вас есть то время Unix преобразовать его в времени UTC (представленного в datetime объекта) и сериализовать его с помощью RFC 3339 time format (a profile of ISO 8601):

>>> from datetime import datetime 
>>> datetime.utcfromtimestamp(1351320785).isoformat() + 'Z' 
'2012-10-27T06:53:05Z' 

Если ваш Android клиент не понимает RFC 3339 , попробуйте варианты:

>>> datetime.utcfromtimestamp(1351320785).isoformat(' ') + '+00:00' 
'2012-10-27 06:53:05+00:00' 
>>> datetime.utcfromtimestamp(1351320785).isoformat(' ') + '+0000' 
'2012-10-27 06:53:05+0000' 

.strftime() method provides even more flexibility.

Смежные вопросы