Как я могу преобразовать формат даты и времени в местное время в JavaScript?

StackOverflow https://stackoverflow.com/questions/436374

Вопрос

У меня есть страница, на которой в настоящее время используется микроформат даты и времени для отображения метки времени , но я показываю только удобочитаемое время для своего часового пояса:

<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 9:16 am (EST)</abbr>

Я хотел бы переписать innerHTML для тега abbr в том же формате, но в местном часовом поясе пользователя. Поэтому для читателя в Сиэтле вышеприведенное должно быть преобразовано в:

<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 6:16 am (PST)</abbr>

Я посмотрел на объект Javascript Date , который позволяет мне получить смещение местного часового пояса. Но у меня есть несколько проблем:

<Ол>
  • Я не вижу простого способа создания нового объекта Date из ISO- 8601 отметка времени. (Полагаю, я мог бы разобрать подстроки или регулярные выражения, если нет более быстрого способа.)

  • Я не вижу способа получить именованное сокращение для часового пояса. Например, для читателя из Сиэтла я бы хотел, чтобы у вас было время (PST). добавлен в конец, иначе пользователю не будет ясно, что метка времени была преобразована (особенно, если он частый посетитель и привык к тому факту, что мои времена в EST).

  • Это было полезно?

    Решение

    Вот мой код, который анализирует метку времени ISO:

    function isoDateStringToDate (datestr) {
      if (! this.re) {
        // The date in YYYY-MM-DD or YYYYMMDD format
        var datere = "(\\d{4})-?(\\d{2})-?(\\d{2})";
        // The time in HH:MM:SS[.uuuu] or HHMMSS[.uuuu] format
        var timere = "(\\d{2}):?(\\d{2}):?(\\d{2}(?:\\.\\d+)?)";
        // The timezone as Z or in +HH[:MM] or -HH[:MM] format
        var tzre = "(Z|(?:\\+|-)\\d{2}(?:\\:\\d{2})?)?";
        this.re = new RegExp("^" + datere + "[ T]" + timere + tzre + "<*>quot;);
      }
    
      var matches = this.re.exec(datestr);
      if (! matches)
        return null;
    
      var year = matches[1];
      var month = matches[2] - 1;
      var day = matches[3];
      var hour = matches[4];
      var minute = matches[5];
      var second = Math.floor(matches[6]);
      var ms = matches[6] - second;
      var tz = matches[7];
      var ms = 0;
      var offset = 0;
    
      if (tz && tz != "Z") {
        var tzmatches = tz.match(/^(\+|-)(\d{2})(\:(\d{2}))$/);
        if (tzmatches) {
          offset = Number(tzmatches[2]) * 60 + Number(tzmatches[4]);
          if (tzmatches[1] == "-")
            offset = -offset;
        }
      }
    
      offset *= 60 * 1000;
      var dateval = Date.UTC(year, month, day, hour, minute, second, ms) - offset;
    
      return new Date(dateval);
    }
    

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

    Другие советы

    EcmaScript формализовал добавление строки стиля ISO-8601 в качестве стимула для даты JavaScript. Поскольку большинство реализаций JS не поддерживают это, я создал оболочку для объекта Date, который обладает этой функциональностью. Если вы установите теги заголовка для вывода в смещении UTC / GMT / Z / Zulu, вы можете использовать мой Расширения EcmaScript 5 для объекта Date JS .

    Для значений DateTime, которые должны использоваться в клиентских сценариях, я обычно стараюсь всегда делать следующее. Хранить дату + время в зоне UTC (даже в базах данных). Передача даты и времени в зоне UTC. От клиента к серверу вы можете использовать метод .toISOString () по приведенной выше ссылке. От сервера к клиенту это относительно просто.

    Через jQuery (с расширением):

    $('.published').each(function(){
      var dtm = new Date(this.title);
      if (!isNaN(dtm)) {
        this.text(dtm.toString());
      }
    });

    Я не помню, добавил ли я поддержку даты-времени non-utc во входных данных, но их было бы не слишком сложно объяснить.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top