Отображать местное время от времени UTC, хранящегося в базе данных SQL в приложении asp.net - PullRequest
5 голосов
/ 15 февраля 2010

У меня есть время, сохраненное в базе данных sql в формате utc. Я отображаю эти времена в виде сетки, однако они все еще в формате UTC. Я хотел бы преобразовать их в браузеры клиента по местному времени. Проблема в том, что хотя я могу получить смещение часового пояса, которое только для текущей даты / времени. Это смещение может измениться, если некоторые из этих дат в будущем произойдут в летнее время. Я относительно новичок в веб-программировании, но мне кажется, что мне нужно запустить какой-то Javascript, поскольку каждая запись привязывается к gridview, который каким-то образом принимает объект datetimeoffset C # и преобразует его в местное время. Или, может быть, это невозможно?

Ответы [ 3 ]

8 голосов
/ 15 февраля 2010

Это можно сделать на стороне сервера, если у вас есть объект TimeZoneInfo. Вы можете использовать статический метод ConvertTimeFromUtc().

В C #:

DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(myDbDateTime, myTimeZoneInfo);

Если у вас нет часового пояса на стороне сервера, все становится непросто, поскольку javascript не предоставляет часовой пояс клиента (если только он не находится в США, и даже тогда только в некоторых браузерах). В этом случае может быть лучше заставить пользователя выбрать свой текущий часовой пояс и сохранить его в своей учетной записи. Если это отображается анонимным пользователям, вам, вероятно, следует отобразить в UTC по умолчанию и предоставить возможность обновить его для выбранного часового пояса.

Обновление

При попытке автоматического определения часового пояса пользователя возникает несколько проблем.

  1. Часовой пояс не предоставляется серверу пользовательским агентом.
  2. Javascript не предоставляет доступ к часовому поясу (за исключением некоторых браузеров, иногда).

Функция javascript getTimezoneOffset() может показаться хорошей идеей, но, поскольку существует несколько часовых поясов с одинаковым смещением, это не уникальное значение. Разница между многими из этих неуникальных зон заключается в использовании летнего времени.

Пример: Индиана не относится к летнему времени. Следовательно, в течение полугода их смещение соответствует восточному времени, а другая половина - центральному времени.

Если, однако, ваша пользовательская база находится в основном в США и использует IE, Chrome, Safari или Firefox, то вы можете использовать метод toString() для объекта Date для получения часового пояса. Эти браузеры добавляют часовой пояс к строке даты различными способами. За пределами США часовой пояс не включен во все браузеры (хотя некоторые все еще могут показывать его).

Открыть http://jsbin.com/onulo3 для наблюдения:
IE8: Вс 14 февраля 22:12:22 EST 2010
Хром: Вс 14 февраля 2010 22:12:22 GMT-0500 (восточное стандартное время)
Safari: Вс 14 февраля 2010 22:12:22 GMT-0500 (восточное стандартное время)
Firefox: Вс 14 февраля 2010 22:12:22 GMT-0500 (восточное стандартное время)

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

1 голос
/ 10 января 2011

Я нашел следующее в «Индианском летнем времени»: http://www.timetemperature.com/tzus/indiana_time_zone.shtml

Начиная с 18.01.2010, вызов системной библиотеки Microsoft TimeZoneInfo.ConvertTimeFromUtc, кажется, отражает это поведение, проверяю ..

0 голосов
/ 16 февраля 2010

Вот два способа конвертации.

Способ № 1: Если у вас дата-время в формате секунд с начала эпохи, просто используйте что-то вроде:

 var d=new Date(seconds_since_epoch);
 document.write(d.toString());

Способ № 2: Если у вас есть только год, месяц, день, час, минута и секунда по времени UTC, используйте:

 var d=new Date(yyyy,mo-1,dd,hh,mi,ss); // in JavaScript, January is month 0
 document.write(d.toString());
...