Как я могу определить часовой пояс смещением UTC?

Я записал сообщение в блоге об этом только что.

производительность наверху выдачи исключения не должна играть роль в Вашем решении. Если Вы делаете его правильно, в конце концов, исключение исключительно .

18
задан Sailing Judo 14 August 2009 в 12:32
поделиться

2 ответа

Краткий ответ: нельзя.

Переход на летнее время делает это невозможным. Например, невозможно определить исключительно по смещению UTC разницу между Аризоной и Калифорнией летом или Аризоной и Нью-Мексико зимой (поскольку в Аризоне не соблюдается летнее время).

Существует также проблема в какое время разные страны соблюдают летнее время. Например, в США летнее время начинается раньше и заканчивается позже, чем в Европе.

Возможно точное предположение (т.е. +/- час), но если вы используете его для отображения времени пользователям, вы неизбежно будете отображать неправильные время для некоторых из них.


Обновление : Судя по комментариям, ваша основная цель - отобразить метку времени в местном часовом поясе пользователя. Если это то, что вы хотите сделать, вы должны отправить время в виде отметки времени в формате UTC, а затем просто перепишите его в браузере пользователя с помощью Javascript. В случае, если у них не включен Javascript, они все равно будут видеть используемую метку времени в формате UTC. Вот функция, которую я придумал в этом вопросе , которую я использовал в скрипте Greasemonkey . Вы можете настроить его в соответствии со своими потребностями.

//@param timestamp An ISO-8601 timestamp in the form YYYY-MM-DDTHH:MM:SS±HH:MM
//Note: Some other valid ISO-8601 timestamps are not accepted by this function
function parseISO8601(timestamp)
{
  var regex = new RegExp("^([\\d]{4})-([\\d]{2})-([\\d]{2})T([\\d]{2}):([\\d]{2}):([\\d]{2})([\\+\\-])([\\d]{2}):([\\d]{2})$");
  var matches = regex.exec(timestamp);
  if(matches != null)
  {
    var offset = parseInt(matches[8], 10) * 60 + parseInt(matches[9], 10);
    if(matches[7] == "-")
      offset = -offset;

    return new Date(
      Date.UTC(
        parseInt(matches[1], 10),
        parseInt(matches[2], 10) - 1,
        parseInt(matches[3], 10),
        parseInt(matches[4], 10),
        parseInt(matches[5], 10),
        parseInt(matches[6], 10)
      ) - offset*60*1000
    );
  }
  return null;
}

Вот функция, которую я использую в своем блоге, чтобы отображать проанализированную метку времени в местном часовом поясе пользователя. Опять же, вы можете настроить его в соответствии с желаемым форматом.

var weekDays = new Array("Sunday", "Monday", "Tuesday", "Wednesday",
        "Thursday", "Friday", "Saturday");
var months = new Array("January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December");

function toLocalTime(date)
{
  var hour = date.getHours();
  var ampm = (hour < 12 ? "am" : "pm");
  hour = (hour + 11)%12 + 1;

  var minutes = date.getMinutes();
  if(minutes < 10)
    minutes = "0" + minutes;

  return weekDays[date.getDay()] + ", "
       + months[date.getMonth()] + " "
       + date.getDate()          + ", "
       + date.getFullYear()      + " at "
       + hour                    + ":"
       + minutes                 + " "
       + ampm;
}
17
ответ дан 30 November 2019 в 08:48
поделиться

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

5
ответ дан 30 November 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: