Pregunta

Tengo una página que actualmente utiliza el microformato de fecha y hora para mostrar una marca de tiempo , pero solo he estado mostrando el tiempo legible por humanos para mi propia zona horaria:

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

Lo que me gustaría hacer es reescribir el innerHTML para que la etiqueta abbr tenga el mismo formato, pero en la zona horaria local del usuario. Entonces, para un lector en Seattle, lo anterior debe convertirse a:

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

He visto el objeto Fecha de JavaScript , que me permite obtener la zona horaria local compensada. Pero tengo algunos problemas:

  1. No veo una manera fácil de crear un nuevo objeto Date a partir de un ISO- 8601 marca de tiempo. (Supongo que podría analizar con subcadenas o expresiones regulares si no hay una forma más rápida).

  2. No veo una manera de obtener la abreviatura con nombre para la zona horaria. Por ejemplo, para un lector en Seattle, me gustaría tener tiempo '' (PST) '' agregado al final, de lo contrario no está claro para ese usuario que la marca de tiempo se ha convertido (especialmente si es un visitante frecuente y se ha acostumbrado al hecho de que mis tiempos están en EST).

¿Fue útil?

Solución

Aquí hay un código mío que analiza una marca de tiempo 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);
}

Desafortunadamente, tampoco maneja las abreviaturas de zona horaria. Tendría que modificar el " tzre " expresión para aceptar letras, y la única solución que conozco para lidiar con las abreviaturas de zona horaria en Javascript es tener una tabla de consulta que mantenga actualizada manualmente en caso de cambios en los horarios de verano regionales.

Otros consejos

EcmaScript formalizó la adición de una cadena de estilo ISO-8601 como entrada para una fecha de JavaScript. Como la mayoría de las implementaciones de JS no admiten esto, creé un contenedor para el objeto Date, que tiene esta funcionalidad. Si configura las etiquetas de título para que se impriman en UTC / GMT / Z / Zulu offset, puede usar mi Extensiones EcmaScript 5 para el objeto Date de JS .

Para los valores de fecha y hora que se utilizarán en los scripts del lado del cliente, generalmente trato de hacer siempre lo siguiente. Almacenar fecha + hora en zona UTC (incluso en bases de datos). Transmitir fecha-hora en la zona UTC. De cliente a servidor, puede usar el método .toISOString () en el enlace anterior. De servidor a cliente, esto es relativamente fácil.

Vía jQuery (con extensión):

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

No recuerdo si agregué soporte para fechas-horas no utc en la entrada, pero no sería demasiado difícil darles cuenta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top