Как хранить мои даты? - PullRequest
       8

Как хранить мои даты?

2 голосов
/ 08 февраля 2012

У меня нет большого опыта работы с датами Utc, но насколько я знаю, они в большинстве случаев являются лучшим способом хранения дат.

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

В настоящее время я сохраняю StartDate и EndDate курса как DateTime (без Utc). Должен ли я сохранить это как Utc, или это не нужно? Потому что мне нужен только день (если пользователь регистрируется 8 февраля в 10:04, система должна знать, что 8 февраля - первый день курса. Возможно, есть лучший способ сохранить эту информацию? И что было бы лучшим способом сохранить даты системных событий (например, пользователь вошел в систему, создал учетную запись и т. д.)?

Я использовал для хранения данных формы также с DateTime, чтобы вычислить, в какой день она была отправлена, но я изменил ее, чтобы она сохраняла только относительный номер дня (например, день 5).

Кстати, я использую C # и базу данных SQL Server.

Ответы [ 3 ]

2 голосов
/ 08 февраля 2012

UTC (Всемирное координированное время) связано с временной составляющей даты. Это стандартный способ хранения DateTimes, чтобы вы могли сравнивать, не беспокоясь о часовых поясах.

Если вас беспокоит только то, что Компонент даты и часовой пояс / Местоположение не важны, вы можете просто сохранить его в базе данных как 2012-02-01 00:00:00

Вы можете получить компонент только с датой в .NET, используя

System.DateTime.Today;

В качестве альтернативы, если вы работаете с какой-то другой датой ...

DateTime dt = DateTime.Now;
dt.Date; // <--- this will give the Date Component with the Time stripped back to 00:00:00
1 голос
/ 08 февраля 2012

Обычно вы хотите хранить в UTC, если ваша система должна работать с разными часовыми поясами.

Допустим, у вас есть пользователь в Гонконге и пользователь в Сиднее, который просматривает одно и то же событие. Если вы хотите, чтобы они оба увидели дату (и время) события в их часовых поясах, то здесь мы, вероятно, вам нужно будет сохранить ее в UTC и затем представить пользователям, уважающим их географическое положение.

Если у вас нет таких требований, вы не выполняете такие преобразования и вы предполагаете только один часовой пояс, тогда вам не нужно добавлять больше сложности в вашу систему, просто используйте столбец Дата и сохраните там текущую дату.

Но если ты это сделаешь - иди на UTC. В этом случае вам понадобится DateTime, а не просто Date. Это потому, что 21:30 в одном часовом поясе может быть 2:30 на следующий день в другом часовом поясе, поэтому время действительно имеет значение.

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

Работать с UTC легко в .NET, DateTime имеет метод .ToUniversalTime (), который преобразует для вас значение даты и времени в UTC:

var utcNow = DateTime.Now.ToUniversalTime();

есть также свойство:

var utcNow = DateTime.UtcNow;

EDITED

Используйте статический класс TimeZoneInfo для преобразования даты и времени в нужные вам часовые пояса (например, из UTC в часовой пояс указанного пользователя:

TimeZoneInfo.ConvertTimeToUtc(...)
TimeZoneInfo.ConvertTimeFromUtc(...)
1 голос
/ 08 февраля 2012

Почему бы вам просто не сохранить даты в столбце базы данных DATE и вообще не беспокоиться о часовых поясах?

...