Как показать время UTC как местное время на веб-странице - PullRequest
16 голосов
/ 04 мая 2010

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

Ответы [ 5 ]

20 голосов
/ 04 мая 2010

Если вам (и вашему веб-сайту) нравится JavaScript, есть очень простой способ сделать это.

Во-первых, на стороне сервера у вас будет дата / время в формате UTC, отформатированные в формате RFC 3339 (стандарт для времени в Интернете, используемый, среди прочего, icalendar). Основной синтаксис RFC 3339:

YYYY-MM-DDTHH:MM:SS

Так, что где бы я ни был, время будет:

2010-05-04T05:52:33

Но когда время не местное, а UTC, вы добавляете Z в конце, чтобы обозначить это. Так что в моем случае, так как я нахожусь в -0500 часов от GMT, то же время выше будет:

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. Краткое объяснение того, что происходит выше:

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

Вторая переменная использует метод Date.parse() для преобразования строки в метку времени эпохи.

Третья переменная создает незаданный объект 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);
1 голос
/ 04 мая 2010

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

0 голосов
/ 10 июня 2018

Вот как я сделал это на PHP в файле входа в систему, который подключается к базе данных MySQL:

//set local timezone
date_default_timezone_set('America/Denver'); //use local TZ

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

0 голосов
/ 04 мая 2010

EDIT:

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

Например, получение американской культуры не поможет, поскольку в США много часовых поясов.

Я думаю, что использование Javascript, как предполагает Энтони, было бы правильным ...

OLD:

Вы можете переопределить метод InitializeCulture () с помощью кода, который устанавливает текущие (выбранные или браузерные отчеты) культуры:

Thread.CurrentThread.CurrentCulture = 
            CultureInfo.CreateSpecificCulture(selectedLanguage);
Thread.CurrentThread.CurrentUICulture = new 
            CultureInfo(selectedLanguage);
0 голосов
/ 04 мая 2010

Конечно возможно. Вам просто нужно найти это country settings, чтобы определить страну, из которой пришел ваш пользователь, а затем изменить отображаемую дату, чтобы она соответствовала времени этой страны. Вы также можете найти другой способ определения страны пользователя (возможно, по его IP-адресу).

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

...