Pergunta

Eu tenho uma página que está atualmente usando o datetime microformat para exibir um timestamp , mas eu só foram mostrando o tempo legível para o meu próprio fuso horário:

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

O que eu gostaria de fazer é reescrever o innerHTML para o tag abbr ser o mesmo formato, mas no fuso horário local do usuário. Assim, para um leitor em Seattle, o acima deve ser convertido em:

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

Eu olhei para o Javascript Data objeto, que me permite obter fuso horário local compensada. Mas eu tenho alguns problemas:

  1. Eu não vejo uma maneira fácil de criar um novo objeto Date a partir de um ISO- 8601 timestamp . (Acho que eu poderia analisar com substrings ou regex se há não mais rápido é maneira.)

  2. Eu não vejo uma maneira de obter a abreviatura nomeado para o fuso horário. Por exemplo, para um leitor em Seattle, eu quero o tempo para ter "(PST)" acrescentados ao final, caso contrário, não está claro para o usuário que o timestamp foi convertido (especialmente se ele é um visitante freqüente e tornou-se acostumado com o fato de que meus dias estão nas EST).

Foi útil?

Solução

Aqui está o código de mina que analisa um timestamp 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 + "$");
  }

  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);
}

Infelizmente, ele não manipula abreviaturas de fuso horário também. Você teria que modificar a expressão "tzre" para aceitar letras, ea única solução que conheço para lidar com abreviaturas de fuso horário em Javascript é ter uma tabela look-up que você manter-se atualizado manualmente em caso de mudanças regionais vezes horário de verão.

Outras dicas

EcmaScript formalizada a adição de uma cadeia de estilo ISO-8601 como um imput uma data JavaScript para. Como a maioria das implementações de JS não suportam isso, criei um wrapper para o objeto Date, que tem essa funcionalidade. Se você definir as tags de título para a saída em UTC / GMT / Z / Zulu offset, você pode usar o meu EcmaScript 5 extensões para o JS Date objeto .

Para DateTime valores que devem ser usados ??em scripts do lado do cliente, eu geralmente tento sempre fazer o seguinte. data loja tempo + na zona UTC (mesmo em bancos de dados). Transmitir data vezes na zona UTC. Do cliente para o servidor, você pode usar o método .toISOString () no link acima. A partir de servidor para o cliente isso é relativamente fácil.

Via jQuery (com extensão):

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

Não me lembro se eu adicionado suporte para não-data UTC vezes na entrada, mas não seria muito difícil para a conta para eles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top