Подтвердить что ты не робот

Как делать часовые пояса в ASP.NET MVC?

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

То, что я планирую делать, - это: когда пользователь приходит на мой сайт, они устанавливают свой часовой пояс, выбирая его из выпадающего списка. Я буду хранить их настройки в своей базе данных и использовать их для расчета времени.

Я не уверен, что мне нужно. Каким должен быть время моей базы данных? Я где-то читал, что он должен храниться как UTC. Как настроить мою базу данных для этого? Кроме того, я буду на общедоступном веб-хостинге, поэтому его нужно настроить таким образом, чтобы я мог это сделать (возможно, через webconfig?).

Далее мне понадобится список всех часовых поясов как HTML-помощник или обычный HTML. Я действительно не хочу это делать.

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

4b9b3361

Ответ 1

С этой целью вы обязательно должны хранить свои метки времени в UTC в базе данных.

Когда вам нужно отобразить дату из базы данных на вашем сайте, вы можете сделать это:

DateTime stamp = /* get datetime from the database here, make sure you
                    use the constructor that allows you to specify the 
                    DateTimeKind as UTC. */

//E.g.
//DateTime stamp = new DateTime(2009, 12, 12, 12, 12, 12, DateTimeKind.Utc);

timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(" /* users time zone here */"); 
var convertedTime = TimeZoneInfo.ConvertTime(stamp, timeZoneInfo);

//Print out the date and time
//Console.WriteLine(convertedTime.ToString("yyyy-MM-dd HH-mm-ss")); 

Список часовых поясов уже доступен в .Net, поэтому вы можете видеть этот пост о том, как их перечислять. Для ASP.Net MVC вместо того, чтобы печатать тайм-аут, вы хотели бы присвоить преобразованному datetime свойству вашего класса модели, чтобы ваш вид мог использовать его для отображения.

Ответ 2

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

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

Я буду честен, asp.net не мой опыт, но я думаю, что вы могли бы как-то получить часовой пояс от клиентского запроса. На самом деле, поскольку правила летнего времени могут быть довольно неясными в зависимости от региона, может быть лучше использовать java script, который вычисляет смещение UTC и использует это для совершения конверсий. Даже после Закона об энергетической политике 2005 года все еще есть некоторые исключения из правил DST, которые с большой долей вероятности будут иметь дело на стороне сервера. Однако я думаю, что вы идете разрешить клиенту устанавливать свой часовой пояс, будет работать в большинстве случаев.

Ответ 3

Сначала проверьте версию MSDN для документации DateTime и прочитайте ее. Вот статья об Best Practices with DateTime, которая охватывает часовые пояса и UTC.

Да, вы должны хранить UTC в своей базе данных. Хранение DateTimes как UTC позволит вам переводить время (и из) пользователей на основе их выбранного часового пояса. Вы на правильном пути!