2009-08-24 2 views
39

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

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

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

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

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

ответ

36

Для этого вам обязательно нужно хранить свои метки времени в 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, так что вы можете увидеть this post on how to enumerate them. Для ASP.Net MVC вместо того, чтобы печатать тайм-аут, вы хотели бы присвоить преобразованное datetime свойству вашего класса модели, чтобы ваш вид мог использовать его для отображения.

+0

Привет, я начну пытаться реализовать это. У меня другое неизвестное. Является ли пользователь на моем сайте, и я хочу пройти через db и посмотреть, какие сообщения они отображают на основе своего часового пояса. Так я бы сначала выяснил, что их время, а затем преобразовать его в UTC? затем сделайте что-нибудь с ним? Так вроде бы обратное то, что вы делаете в своем примере? – chobo2

+0

Ну, изначально вы упомянули, позволяя пользователю установить свой часовой пояс. Тем не менее, существует несколько способов обнаружения часового пояса пользователя через javascript, вы можете искать вокруг stackoverflow для получения дополнительной информации, например, этот пост: http://stackoverflow.com/questions/1017053/finding-the-clients-timezone- and-culture-via-web-service – womp

+0

Мне хорошо, когда они выбирают свой часовой пояс и на самом деле не хотят заглядывать в javascript прямо сейчас. Я просто говорю, будет ли это так, как я начну искать конкретные даты в своем db? Попытаться преобразовать обратно в UTF? – chobo2

2

Сначала проверьте документацию MSDN на дату DateTime и прочитайте на нем. Here is an article по передовой практике с DateTime, которая охватывает часовые пояса и UTC.

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

9

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

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

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