Analysieren des Datums von ISO 8601 in Javascript

71

Benötigen Sie Hilfe / Tipps zum Konvertieren eines ISO 8601-Datums mit der folgenden Struktur in Javascript?

CCYY-MM-DDThh:mm:ssTZD

Ich möchte das Datum so formatieren:

January 28, 2011 - 7:30PM EST

Ich möchte diese Lösung so sauber und minimal wie möglich halten.

Slythic
quelle
1
Ich weiß, dass dies ein alter Beitrag ist, aber diese Bibliothek macht, was Sie wollen: github.com/csnover/js-iso8601
Steve

Antworten:

33

datejs könnte folgendes analysieren, vielleicht möchten Sie es ausprobieren.

Date.parse('1997-07-16T19:20:15')           // ISO 8601 Formats
Date.parse('1997-07-16T19:20:30+01:00')     // ISO 8601 with Timezone offset

Bearbeiten: Regex-Version

x = "2011-01-28T19:30:00EST"

MM = ["January", "February","March","April","May","June","July","August","September","October","November", "December"]

xx = x.replace(
    /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):\d{2}(\w{3})/,
    function($0,$1,$2,$3,$4,$5,$6){
        return MM[$2-1]+" "+$3+", "+$1+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6
    }
)

Ergebnis

January 28, 2011 - 7:30PM EST

Edit2: Ich habe meine Zeitzone auf EST geändert und jetzt folge ich

x = "2011-01-28T19:30:00-05:00"

MM = {Jan:"January", Feb:"February", Mar:"March", Apr:"April", May:"May", Jun:"June", Jul:"July", Aug:"August", Sep:"September", Oct:"October", Nov:"November", Dec:"December"}

xx = String(new Date(x)).replace(
    /\w{3} (\w{3}) (\d{2}) (\d{4}) (\d{2}):(\d{2}):[^(]+\(([A-Z]{3})\)/,
    function($0,$1,$2,$3,$4,$5,$6){
        return MM[$1]+" "+$2+", "+$3+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6 
    }
)

Rückkehr

January 28, 2011 - 7:30PM EST

Grundsätzlich

String(new Date(x))

Rückkehr

Fri Jan 28 2011 19:30:00 GMT-0500 (EST)

Regex-Teile konvertieren nur die obige Zeichenfolge in das gewünschte Format.

January 28, 2011 - 7:30PM EST
SIE
quelle
Ich mache ein Widget und würde es vorziehen, wenn ich nur eine einfache Funktion hätte, die ich in meine JS-Datei werfen könnte. Ich denke, DataJs könnten dafür übertrieben sein? Danke für den Vorschlag und die schnelle Antwort !!
Slythic
@Slythic, ich werde dann Regex schreiben, bitte warte.
SIE
@Slythic, aktualisiert, lass es mich wissen, wenn es einen Fehler gibt.
SIE
Hmm ... funktioniert nicht wie erwartet. Ich hätte das vorher hinzufügen sollen! Hier ist ein Beispiel für ein zurückgegebenes Datum: "2011-01-28T19: 30: 00-05: 00"
Slythic
ah, ok, Zeitzone ist keine Zeichenfolge, lassen Sie mich herausfinden, wie man das analysiert.
SIE
91

Das Date-Objekt behandelt 8601 als ersten Parameter:

var d = new Date("2014-04-07T13:58:10.104Z");
console.log(d.toString());

Rob Evans
quelle
10
Nicht in allen Browsern. Beachten Sie, dass die ECMA-Spezifikation hinsichtlich des Parameterformats von Date () vage war oder ist. Deshalb kann auch IE11 nicht mit dem umgehen, was Sie vorschlagen.
René Stalder
1
@ RenéStalder Ich habe das gerade in IE11 getestet und es funktioniert. Haben Sie in anderen IE-Versionen getestet?
Rob Evans
8
@ RenéStalder Gerade in IE9 auf Win7 getestet und es funktioniert auch dort. Tatsächlich habe ich bisher keinen einzigen Browser gefunden, der dies nicht unterstützt.
Rob Evans
1
Funktioniert im IE 9: Quirks-Modus sicher nicht. Einige von uns benötigen Browserkompatibilität.
Programmiererravi
2
Die Datumsanalyse ist bis ES5 implementierungsabhängig. Alte Browser zeigen inkonsistente Ergebnisse an.
Mrchief
16

Wenn Sie es einfach halten möchten, sollte dies ausreichen:

function parseIsoDatetime(dtstr) {
    var dt = dtstr.split(/[: T-]/).map(parseFloat);
    return new Date(dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, 0);
}

Beachten Sie, dass parseFloat ein Muss ist, parseInt funktioniert nicht immer. Für die Karte ist IE9 oder höher erforderlich.

Funktioniert für Formate:

  • 28.12.2014 15:30:30
  • 2014-12-28T15: 30: 30
  • 28.12.2014

Nicht gültig für Zeitzonen, siehe andere Antworten zu diesen.

Ciantic
quelle
4
+1 einfach und tragbar. Ich habe diese Änderung vorgenommen, um Daten als UTC zu interpretieren:return new Date(Date.UTC(dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, 0));
Chris Olsen
Sehr nette kleine Funktion, die den wichtigsten Teil erledigt: das Korrigieren des Dang-Month-Index.
Seth
4

Vielleicht können Sie moment.js verwenden, das meiner Meinung nach die beste JavaScript-Bibliothek zum Parsen, Formatieren und Arbeiten auf der Clientseite ist. Sie könnten etwas verwenden wie:

var momentDate = moment('1890-09-30T23:59:59+01:16:20', 'YYYY-MM-DDTHH:mm:ss+-HH:mm:ss');
var jsDate = momentDate.toDate();

// Now, you can run any JavaScript Date method

jsDate.toLocaleString();

Der Vorteil der Verwendung einer Bibliothek wie moment.js besteht darin, dass Ihr Code auch in älteren Browsern wie IE 8+ einwandfrei funktioniert.

Hier ist die Dokumentation zu Parsing-Methoden: https://momentjs.com/docs/#/parsing/

alex-arriaga
quelle
0

Sieht aus wie moment.js ist das beliebteste und mit aktiver Entwicklung:

moment("2010-01-01T05:06:07", moment.ISO_8601);
Mihai
quelle
-1

Laut MSDN bietet das JavaScript-Datumsobjekt keine spezifischen Datumsformatierungsmethoden (wie Sie möglicherweise bei anderen Programmiersprachen sehen). Sie können jedoch einige der DateMethoden und Formatierungen verwenden, um Ihr Ziel zu erreichen:

function dateToString (date) {
  // Use an array to format the month numbers
  var months = [
    "January",
    "February",
    "March",
    ...
  ];

  // Use an object to format the timezone identifiers
  var timeZones = {
    "360": "EST",
    ...
  };

  var month = months[date.getMonth()];
  var day = date.getDate();
  var year = date.getFullYear();

  var hours = date.getHours();
  var minutes = date.getMinutes();
  var time = (hours > 11 ? (hours - 11) : (hours + 1)) + ":" + minutes + (hours > 11 ? "PM" : "AM");
  var timezone = timeZones[date.getTimezoneOffset()];

  // Returns formatted date as string (e.g. January 28, 2011 - 7:30PM EST)
  return month + " " + day + ", " + year + " - " + time + " " + timezone;
}

var date = new Date("2011-01-28T19:30:00-05:00");

alert(dateToString(date));

Sie können sogar noch einen Schritt weiter gehen und die Date.toString()Methode überschreiben :

function dateToString () { // No date argument this time
  // Use an array to format the month numbers
  var months = [
    "January",
    "February",
    "March",
    ...
  ];

  // Use an object to format the timezone identifiers
  var timeZones = {
    "360": "EST",
    ...
  };

  var month = months[*this*.getMonth()];
  var day = *this*.getDate();
  var year = *this*.getFullYear();

  var hours = *this*.getHours();
  var minutes = *this*.getMinutes();
  var time = (hours > 11 ? (hours - 11) : (hours + 1)) + ":" + minutes + (hours > 11 ? "PM" : "AM");
  var timezone = timeZones[*this*.getTimezoneOffset()];

  // Returns formatted date as string (e.g. January 28, 2011 - 7:30PM EST)
  return month + " " + day + ", " + year + " - " + time + " " + timezone;
}

var date = new Date("2011-01-28T19:30:00-05:00");
Date.prototype.toString = dateToString;

alert(date.toString());
Ryan V.
quelle