Frage

Ich habe eine Seite, die gerade mit dem Datetime-Mikroformat einen Zeitstempel anzuzeigen die für Menschen lesbare Zeit für meine eigene Zeitzone, aber ich nur worden zeigt:

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

Was möchte ich tun, ist die Innerhtml für das abbr-Tag neu schreiben das gleiche Format, aber in der Benutzer lokalen Zeitzone zu sein. Also für einen Leser in Seattle, soll die oben umgewandelt werden:

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

Ich habe auf der Javascript Date-Objekt , die mir erlaubt, zu erhalten die lokale Zeitzone gegenüber. Aber ich habe ein paar Probleme:

  1. Ich sehe nicht, eine einfache Möglichkeit, ein neues Date-Objekt von einem ISO- zu erstellen 8601 Zeitstempel. (Ich nehme an, ich mit Substrings oder Regex analysieren könnte, wenn es kein schnellerer Weg.)

  2. Ich sehe keinen Weg, um den Namen Abkürzung für die Zeitzone zu erhalten. Zum Beispiel für einen Leser in Seattle, würde ich die Zeit zu haben „(PST)“ am Ende angehängt will, sonst ist es nicht klar, dass Benutzer, dass der Zeitstempel umgewandelt wurde (vor allem, wenn er ein häufiger Gast ist und hat daran gewöhnt, dass meine Zeiten in EST).

War es hilfreich?

Lösung

Hier ist der Code von mir, das einen ISO-Zeitstempel analysiert:

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

Leider ist es nicht Zeitzone Abkürzungen behandelt entweder. Sie würden die „tzre“ Ausdruck ändern Buchstaben zu akzeptieren, und die einzige Lösung, die ich kenne mit Zeitzone Abkürzungen in Javascript zu tun ist, eine Nachschlagtabelle haben, die Sie auf dem Laufenden halten manuell im Falle von Änderungen an regionalen Sommerzeiten.

Andere Tipps

EcmaScript formalisierte die Zugabe eines ISO-8601-Stil-String als imput für ein JavaScript Datum. Da die meisten JS Implementierungen dies nicht unterstützen, habe ich einen Wrapper zu dem Date-Objekt, das diese Funktionalität aufweist. Wenn Sie die Titel-Tags zur Ausgabe in UTC / GMT / Z / Zulu-Offset einstellen, können Sie meine EcmaScript 5 Erweiterungen für JS des Date-Objekt .

Für Datetime-Werte, die in clientseitigen Skripte zu verwenden sind, versuche ich im Allgemeinen immer auf die folgenden tun. Shop Datum + Uhrzeit in UTC-Zone (auch in Datenbanken). Transmit Datum-Zeiten in UTC-Zone. Vom Client zum Server, können Sie den .toISOString () -Methode in dem obigen Link verwenden. Vom Server-zu-Client ist dies relativ einfach.

Via jQuery (mit Erweiterung):

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

Ich erinnere mich nicht, wenn ich die Unterstützung für Nicht-UTC-Datum-mal in der Eingabe hinzugefügt, aber nicht zu hart für sie sein Konto.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top