У меня есть база данных, которая содержит время как UTC. Это время можно показать на веб-странице, поэтому мне было предложено показать его как местное время на странице, так как оно может быть просмотрено из любой страны. Коллега кое-что упомянул о настройке страны из текущего потока (на сервере), но я не мог найти никаких подробностей об этом. Я хочу сделать это?
Как показать время UTC как местное время на веб-странице?
Ответ 1
Если вы (и ваш сайт) удобны с javascript, есть очень простой способ сделать это.
Во-первых, на стороне сервера у вас будет дата/время UTC, отформатированное в формате RFC 3339 (стандарт для интернет-времени, используемый, среди других протоколов, icalendar). Основной синтаксис RFC 3339:
YYYY-MM-DDTHH:MM:SS
Так, что, где я, время будет:
2010-05-04T05:52:33
Но когда время не локальное, а UTC, вы добавляете Z
в конец, чтобы обозначить это. Так что в моем случае, так как я нахожусь в -0500 часов по Гринвичу, то же самое время было бы:
2010-05-04T10:52:33Z
Итак, сначала вы получите сервер для вывода вышеперечисленного на ваш веб-сайт javascript. Затем javascript может проанализировать эту метку времени, и она выведет дату и время, настроенные на часовой пояс браузера (который определяется компьютером, на котором размещен браузер). Вы должны помнить, что если пользователь из Токио и просматривает ваш сайт в Испании, он увидит метку времени в Токио, если они не отрегулировали свои компьютерные часы.
Итак, javascript будет:
var time_string_utc = some_server_variable; // timestamp from server
var time_string_utc_epoch = Date.parse(time_string_utc);
var time_utc = new Date();
time_utc.setTime(time_string_utc_epoch);
В этот момент у вас есть объект даты javascript, установленный на метку времени UTC. Быстрое объяснение того, что происходит выше:
Первая переменная предполагает, что вы передали строку timestamp этой переменной с сервера.
Вторая переменная использует метод Date.parse()
для преобразования строки в метку времени.
Третья переменная создает объект Unset Date.
В последней строке используется метод setTime
, который устанавливает объект Date из временной метки эпохи.
Теперь, когда у вас есть объект, вы можете вывести его пользователю, как сочтете нужным. В качестве простого эксперимента вы можете использовать:
document.write(time_utc);
который, если вы находитесь в моем часовом поясе, используя временную метку UTC, я начал с:
2010-05-04T10:52:33Z
даст:
Tue May 04 2010 05:52:33 GMT-0500 (CST)
но вы можете использовать различные методы javascript для форматирования времени во что-то более приятное.
Не нужно угадывать страну пользователя или даже настраивать метку времени, если вы доверяете часовому поясу локального браузера/компьютера пользователя.
Опять же, короткая версия:
var time_string_utc = some_server_variable; // UTC time from server
var time_string_utc_epoch = Date.parse(some_server_variable);
var time_utc = new Date();
time_utc.setTime(time_string_utc_epoch);
document.write(time_utc);
Ответ 2
Также рассмотрите возможность чтения этой темы, которая погружается глубже в dos и donts обработки проблемы с летним временем во время часовых поясов
Ответ 3
Возможно. Вам просто нужно найти country settings
, чтобы определить страну, откуда пришел ваш пользователь, а затем изменить отображаемую дату в соответствии с этим временем страны. Вы также можете найти другой способ обнаружить страну пользователя (возможно, с его IP-адреса).
Я уверен, что лучший способ справиться с этим - это позволить вашему коллеге узнать, что вам нужно больше информации о реализации параметров страны в вашем проекте и как вы можете его использовать.
Ответ 4
EDIT:
Думая об этом, я не думаю, что можно показать местное время, когда у вас есть культура клиентов. Мне было бы интересно увидеть предложение ваших коллег.
Получение американской культуры, например, не поможет, поскольку у США много часовых поясов.
Я думаю, что использование Javascript, как предлагает Энтони, было бы способом...
OLD:
Вы можете переопределить метод InitializeCulture() с кодом, который устанавливает текущие (выбранные или отображаемые в браузере) культуры:
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new
CultureInfo(selectedLanguage);