Строка ISO 8601 вместо даты и времени - PullRequest
0 голосов
/ 25 января 2019

Я сталкивался с этой проблемой в других проектах, но сейчас мы работаем в Django / Python с Vue.js и PostgreSQL.

Почти каждое поле 'date' в нашей модели действительно является датой,не свиданиеБизнес-пользователи не заботятся о временной части, на самом деле хранение любой такой ценности вводит в заблуждение.Хорошим примером является дата вступления в силу налоговой ставки.С точки зрения пользователя, он вступает в силу в полночь указанной даты.

Если мы храним это как Django DateTimeField или DateField, для него требуется часть времени.Это может быть 0000h, но значение не имеет никакого значения для бизнеса, потому что им никогда не нужно будет что-либо видеть или сравнивать с временной частью.Функциональность Django великолепна, если мы хотим сохранить реальное время, поместить его в базу данных как UTC, а затем отобразить его пользователям по местному времени с помощью автоматического преобразования часовых поясов.Но мы неЕсли дата вступления в силу - 1 марта 2019 года, она должна отображаться как таковая независимо от часового пояса пользователя.Если дата сохраняется как дата-время (2019, 3, 1, 0, 0, 0) и вводится кем-то в Ванкувере, она будет отображаться как следующий календарный день для другого пользователя в Торонто.Определенно не то, что мы хотим.Мы могли бы запугать его, установив временную часть на 1200h, но на самом деле?

У нас также есть потенциальные проблемы, в зависимости от внутреннего представления в базе данных, при использовании SQL или инструментов, которые обращаются к схеме напрямую (например, BIинструменты).Как мы узнаем, какой часовой пояс применяется к значению даты и времени?

Итак, мы думаем об использовании Django CharField с форматом ISO 8601 (ГГГГ-ММ-ДД).Он будет отсортирован правильно, его можно будет легко сравнить (или напрямую в некоторых инструментах, таких как SQL), и можно отобразить без переформатирования, если клиент желает использовать стандарт.Если нам нужно сделать арифметику даты, мы можем использовать дату и время из стандартных библиотек Python для преобразования из / в строку.В любом случае, нам нужно будет использовать их для отлова атак с использованием SQL-инъекций.

Нам также нужно будет заняться вводом даты через Datepicker, преобразовать его в строку ISO 8601 перед сохранением и снова при отображении для редактирования.

Похоже, что это лучший способ представить то, что нужно бизнесу, и он избавляет от любых проблем с преобразованием часовых поясов.

Конечно, есть много комментариев по поводу обработки времени и даты, ноЯ не нашел никого, кто бы использовал этот подход для хранения истинных дат.Я скучаю по важному «поймал»?Мы достаточно рано в проекте, и мы можем пойти по любому пути, поэтому я надеюсь подтвердить, что это сработает, прежде чем рефакторинг станет большой работой.

1 Ответ

0 голосов
/ 25 января 2019

Рассматривали ли вы использование DateField ?

При этом будет храниться только часть даты, а не время.

...