Я знаю, что это довольно распространенный вопрос, но я не чувствую, что ответы, которые я нашел, действительно решают проблему. Я расскажу о своем конкретном примере использования и приведу резюме к информации из других ответов SO и в Интернете.Временные метки: iso8601 vs unix timestamp
Для обслуживания я пишу записи базы данных создаются и хранятся как на мобильных устройствах, так и на нашем веб-сайте и должны синхронизироваться в обоих направлениях. В настоящее время мы ориентируемся на Android и iOS, которые используют SQLite как реляционную базу данных. Серверная сторона реализована в Python с использованием Django с MySQL, но другие решения могут заменить это в будущем.
Синхронизация будет реализована в соответствии с идеями, изложенными в этом ответе SO: https://stackoverflow.com/a/5052208/2076094. Для синхронизации мы будем использовать временную метку, установленную только сервером и синхронизированную с клиентами, last_synced_date и отметки времени для создания и обновления объекта. Поскольку объекты ссылаются на то, что пользователь сделал в определенное время, они также имеют информацию о временной отметке.
Мой вопрос касается только внутреннего представления времени, используемого для этих временных меток. Представление пользователя в пользовательском интерфейсе представляет собой локализованную и отформатированную версию внутреннего представления. Существует множество различных способов как на языках реализации, так и в разных базах данных, используемых для представления временных меток. После довольно много исследований, кажется, есть только действительных решений осталось:
- Unix-время
- ISO8601
Это article, который был на Hacker News (дважды) предлагает использовать UNIX время и представляет довольно хороший аргумент. Дискуссия о HN, как и следовало ожидать, немного расходится вокруг двух пунктов, описанных выше, а затем и некоторых.
До сих пор мой вывод состоит в том, что временные метки Unix-времени легче обрабатывать, но, похоже, это не обычный способ работы в Django. Почти каждый пример кода, который я нашел, из учебника Django для многих других сайтов, использует DateTimeField в файле models.py, который сопоставляется с каким-то полем даты в SQL, точными терминами в зависимости от используемой базы данных.
Недостатком использования дат ISO8601 для передачи и хранения является то, что они должны быть проанализированы для создания типа даты соответствующего языка реализации. Это не сложно, а раздражительно. Для каждого отдельного языка, который мы используем, вам нужна либо небольшая библиотека, либо, по крайней мере, больше кода, чем вы могли бы надеяться. Это не очень красиво, создает зависимости и, вероятно, немного медленнее. Временные метки Unix-времени не имеют этой проблемы в любом значении, которое я знаю.
Другое дело, что вы можете легко попасть в проблему, используя «умные» поля «Дата» или «Временная метка» в базе данных (и во время разбора). Есть много вопросов о SO относительно магии времени, которая закручивает вещи. Мой лимит связи достигнут, поэтому я не могу опубликовать его, но вы легко найдете его;)
Мы могли бы использовать упрощенный формат, который не включает информацию о часовом поясе и всегда использовать UTC. Мы будем использовать UTC только в любом случае, но, похоже, если вы используете ISO8601, вы можете использовать формат, который универсально понятен и недвусмыслен. Unix-время всегда в UTC, так что вам никогда не придется беспокоиться об этом.
Конечно, ISO8601 имеет то преимущество, что он читается человеком, когда вы смотрите на необработанную базу данных, и мне не придется переписывать пару строк кода незадолго до 2038 года, но это, похоже, не компенсирует отрицательные стороны.
Кажется, что, написав вещи, у меня есть уже мой ответ;) В любом случае, я хотел бы знать, что думают другие и что вы делаете в своих проектах. Пожалуйста, дайте краткое описание вашего варианта использования, чтобы другие могли лучше классифицировать ваш ввод.
Спасибо!
Всегда использовать UTC для часового пояса и конвертировать в местное время, когда вам нужно местное время. –
@ AnthonyHunt .... Почему? Время Unix - это число. * его значение ВСЕГДА GMT * это намного короче (Отметка времени Unix требует 32 разрядное целое число в то время как временные метки требуют 200 бит ASCII) * это платформа/язык агностик и обрабатывается всеми языками программирования * 64 разрядные операционные системы используют 64-битное целое число t_time, так что это продлится жаркой смерти Вселенной Так что мне очень любопытно, почему вы решили пожертвовать мобильностью, размером и малярией для синтаксического анализа строк? – Ancarius