Почему LocalTime отображает время сервера, а не время браузера? - PullRequest
1 голос
/ 19 ноября 2008

Я, вероятно, делаю что-то не так - но не могу понять, почему. У меня есть поле DateTime в моей БД, сохраняющее время UTC

Мой сервер находится в США, а браузер - в Европе.

Код загрузки страницы выглядит следующим образом:

DateTime t = DateTime.SpecifyKind((DateTime)rdr["startTime"], DateTimeKind.Utc);
label1.Text = t.ToLocalTime().ToString();

Отображаемое мной время - местное время в США, а не в Европе. Что я должен сделать, чтобы отобразить местное время браузера?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 19 ноября 2008

Один из методов - определить смещение часового пояса клиента (в минутах) с помощью JavaScript в браузере клиента:

alert((new Date()).getTimezoneOffset();

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

3 голосов
/ 19 ноября 2008

toLocalTime выполняется на вашем сервере, а не в браузере. Если вы хотите преобразовать даты на стороне сервера, вы должны получить часовой пояс, в котором находится пользователь (в Европе есть как минимум 3 часовых пояса, 6, если считать летнее время ....)

Один из подходов - отправить клиенту время UTC, а затем использовать некоторый javascript для преобразования его в местное время пользователя (объект Date в javascript знает, на что настроена система пользователей)

1 голос
/ 19 ноября 2008

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

Если у вас много клиентов в разных часовых поясах, а сохраненная информация когда-либо сопоставляется или передается - порядок событий будет неправильным. Например, в 10:16 по Гринвичу до 10:30 по восточному поясному времени США.

По этой причине лучше использовать время сервера (или лучше, как уже было сказано другими - попробуйте использовать UTC).

1 голос
/ 19 ноября 2008

Когда некоторые написали , код выполняется на сервере - поэтому имеет смысл, что применяемый часовой пояс является локальным для сервера.

Помимо его предложения отправить UTC в браузер (что хорошо, когда он доступен, но не всегда доступен), вам следует обратить внимание на TimeZoneInfo , если вы используете .NET 3.5. Это позволит вам конвертировать между UTC и произвольными часовыми поясами, включая исторические изменения. (В часовых поясах гораздо больше, чем просто «GMT + 5» и т. Д.) Большая трудность заключается в том, чтобы выяснить, в каком часовом поясе находится пользователь. Обычно вы можете получить текущее смещение от UTC с помощью JavaScript, но это не дает вся информация, которая вам нужна, чтобы правильно ее понять. Рано или поздно вам, вероятно, придется установить индивидуальную настройку для каждого часового пояса.

...