Как сделать часовые пояса в ASP.NET MVC? - PullRequest
39 голосов
/ 24 августа 2009

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

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

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

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

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

Ответы [ 4 ]

36 голосов
/ 24 августа 2009

Для этой цели вам обязательно нужно хранить свои метки времени в формате 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 вместо вывода тайм-аута вы можете назначить преобразованную дату-время свойству класса модели, чтобы ваш View мог использовать его для отображения.

9 голосов
/ 24 августа 2009

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

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

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

2 голосов
/ 24 августа 2009

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

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

0 голосов
/ 10 марта 2019

Usage

getCurrentDateTimeWithTimeZone("Central Europe Standard Time");

Метод

public DateTime getCurrentDateTimeWithTimeZone(string strTimeZone)
    {
        var localTimezone = TimeZoneInfo.Local;
        var userTimezone = TimeZoneInfo.FindSystemTimeZoneById(strTimeZone);

        var todayDate = DateTime.Now;
        var todayLocal = new DateTimeOffset(todayDate,
                                            localTimezone.GetUtcOffset(todayDate));

        var todayUserOffset = TimeZoneInfo.ConvertTime(todayLocal, userTimezone);
        return todayUserOffset.DateTime;

    }

Список идентификаторов часовых поясов

Стандартное время даты

UTC-11

Стандартное время Самоа

Гавайское стандартное время

Стандартное время Аляски

Тихоокеанское стандартное время (Мексика)

тихоокеанское стандартное время

Стандартное время США в горах

Горное стандартное время (Мексика)

Горное стандартное время

Стандартное время Центральной Америки

Центральное поясное время

Центральное поясное время (Мексика)

Центральное канадское стандартное время

стандартное тихоокеанское тихоокеанское время

Восточное стандартное время

восточное стандартное время США

Стандартное время Венесуэлы

Стандартное время Парагвая

Атлантическое стандартное время

Центральное бразильское стандартное время

Западное стандартное время SA

Pacific SA Стандартное время

Стандартное время Ньюфаундленда

E. Стандартное время Южной Америки

Стандартное время Аргентины

стандартное восточное время

Стандартное время Гренландии

Стандартное время Монтевидео

UTC-02

Среднеатлантическое стандартное время

Стандартное время Азорских островов

Стандартное время Кабо-Верде

Марокко Стандартное время

UTC

стандартное время по Гринвичу

Стандартное время по Гринвичу

W. Стандартное европейское время

Стандартное время Центральной Европы

Стандартное романтическое время

Центрально-европейское стандартное время

W. Стандартное время Центральной Африки

Стандартное время Намибии

Стандартное время Иордании

Стандартное время GTB

Стандартное время Ближнего Востока

Стандартное время Египта

Стандартное время Сирии

Стандартное время Южной Африки

Стандартное время FLE

Стандартное время Израиля

E. Стандартное европейское время

Стандартное арабское время

арабское стандартное время

Российское стандартное время

E. Стандартное время Африки

Стандартное время Ирана

Стандартное арабское время

Стандартное время Азербайджана

Стандартное время Маврикия

Грузинское стандартное время

Кавказское стандартное время

Стандартное время Афганистана

Екатеринбургское стандартное время

Стандартное время Пакистана

Стандартное время Западной Азии

Стандартное время Индии

Стандартное время Шри-Ланки

Стандартное время Непала

Стандартное время Центральной Азии

Стандартное время Бангладеш

N. Стандартное время Центральной Азии

Стандартное время Мьянмы

стандартное азиатское время

Стандартное время Северной Азии

Стандартное время Китая

Северо-восточное стандартное время Восточной Азии

Стандартное время Сингапура

W. Стандартное время Австралии

Стандартное время Тайбэя

Стандартное время Улан-Батора

Стандартное время Токио

Стандартное время Кореи

Якутское стандартное время

Сеп. Стандартное время Австралии

Центральное стандартное время AUS

E. Стандартное время Австралии

AUS Восточное стандартное время

западное тихоокеанское стандартное время

Стандартное время Тасмании

Владивостокское стандартное время

Центральное тихоокеанское стандартное время

Стандартное время Новой Зеландии

UTC + 12

Стандартное время Фиджи

Камчатское стандартное время

Стандартное время Тонга

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...