949 Stimmen

Parsing einer Zeichenkette zu einem Datum in JavaScript

Wie kann ich in JavaScript eine Zeichenkette in ein Datumsobjekt umwandeln?

var st = "date in some format"
var dt = new Date();

var dt_st = // st in Date format, same as dt.

17voto

Das ist in meinen Augen die beste und einfachste Lösung:

Verketten Sie einfach Ihre Datumszeichenfolge (mit ISO-Format ) mit "T00:00:00" am Ende und verwenden Sie die JavaScript Datum()-Konstruktor wie im folgenden Beispiel.

const dateString = '2014-04-03'
var mydate = new Date(dateString + "T00:00:00");
console.log(mydate.toDateString());

Und noch ein paar Details zu der obigen Lösung (aber das Lesen ist freiwillig):

Im ISO-Format, wenn Sie die Zeit angeben und Z nicht am Ende von Zeichenkette, das Datum wird in der lokalen Zeitzone statt in UTC angezeigt Zone . Das heißt, wenn Einstellung ein Datum auf diese Weise, ohne die Zeitzone anzugeben, verwendet JavaScript die Zeitzone des lokalen Browsers Zone. Und wenn unter ein Datum, ohne Angabe der Zeitzone angeben, wird das Ergebnis ebenfalls in die Zeitzone des Browsers umgerechnet. Und, standardmäßig fast jede Datumsmethode in JavaScript (außer einer) gibt das Datum/die Uhrzeit auch in der lokalen Zeitzone an (UTC erhält man nur, wenn Sie UTC angeben). Wenn Sie also in der lokalen/Browser-Zeitzone arbeiten, werden Sie wahrscheinlich werden Sie wahrscheinlich keine unerwünschten Ergebnisse erhalten, da der Unterschied zwischen Ihrer Zeitzone und der UTC-Zeitzone, was einer der Hauptkritikpunkte an der Beschwerden bei der Konvertierung von Datumszeichenfolgen. Aber wenn Sie diese Lösung verwenden, sollten Sie Ihren Kontext verstehen und sich bewusst sein, was Sie tun. Und seien Sie auch vorsichtig, dass Weglassen von T oder Z in einer Datum-Zeit-Zeichenkette kann in verschiedenen Browsern zu unterschiedlichen Ergebnissen führen.

Es ist wichtig zu beachten, dass das obige Beispiel genau dasselbe Ergebnis liefert wie das Beispiel unten, das die zweitmeisten Stimmen in dieser Frage erhält:

var parts ='2014-04-03'.split('-');
// Please pay attention to the month (parts[1]); JavaScript counts months from 0:
// January - 0, February - 1, etc.
var mydate = new Date(parts[0], parts[1] - 1, parts[2]); 
console.log(mydate.toDateString());

Der Hauptunterschied besteht darin, dass das erste Beispiel einfacher und sogar fehlerfreier ist als das zweite (zumindest meiner Meinung nach, wie weiter unten erläutert).

Denn wenn Sie die JavaScript Datum()-Konstruktor date mit nur einem Datum-String-Argument im ISO-Format (erstes Beispiel), akzeptiert es keine Werte oberhalb seiner logischen Grenze (wenn Sie also 13 als Monat oder 32 als Tag angeben, erhalten Sie Invalid Date).

Wenn Sie jedoch denselben Konstruktor mit mehreren Datumsargumenten verwenden (zweites Beispiel), werden die Parameter oberhalb der logischen Grenze an den angrenzenden Wert angepasst und Sie werden nicht den Fehler "Ungültiges Datum" erhalten. (wenn Sie also 13 als Monat eingeben, wird der Wert auf 1 angepasst, anstatt Ihnen ein ungültiges Datum anzuzeigen).

Oder eine alternative (und dritte) Lösung wäre eine Mischung aus beidem, wobei das erste Beispiel nur zur Validierung der Datumszeichenkette verwendet wird, und wenn diese gültig ist, das zweite Beispiel verwendet wird (so vermeiden Sie mögliche Browser-Inkonsistenzen des ersten Beispiels und gleichzeitig die Zulassung von Parametern über die logische Grenze des zweiten Beispiels hinaus).

So (es werden auch Teildaten akzeptiert):

function covertStringToDate(dateString) {
    //dateString should be in ISO format: "yyyy-mm-dd", "yyyy-mm" or "yyyy"
    if(new Date(dateString).toString() === "Invalid Date") {
        return false
    } else {
        const onlyNumbers = dateString.replace(/\D/g, ""); 
        const year = onlyNumbers.slice(0,4) 
        const month = onlyNumbers.slice(4,6)
        const day = onlyNumbers.slice(6,8)
        if(!month){
            return(new Date(year))
        } else if (!day) {
            return(new Date(year, month - 1))
        } else {
            return(new Date(year, month - 1, day))
        }        
    }
}

Und eine vierte Alternative (und letzter Vorschlag) wäre die Verwendung einer geeigneten dritten Bibliothek (wie Moment ou datum-fns )

Referenzen:

15voto

Lucky Soni Punkte 6636

Zeitstempel sollten in eine Zahl umgewandelt werden

var ts = '1471793029764';
ts = Number(ts); // cast it to a Number
var date = new Date(ts); // works

var invalidDate = new Date('1471793029764'); // does not work. Invalid Date

15voto

Alexandre N. Punkte 2304

Wenn Sie vom Format "tt/MM/jjjj" konvertieren möchten. Hier ist ein Beispiel:

var pattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
var arrayDate = stringDate.match(pattern);
var dt = new Date(arrayDate[3], arrayDate[2] - 1, arrayDate[1]);

Diese Lösung funktioniert in IE-Versionen kleiner als 9.

11voto

niksvp Punkte 5485

Date.parse bekommt man fast das, was man will. Es erstickt an den am / pm Teil, aber mit etwas Hacking können Sie es zum Laufen bringen:

var str = 'Sun Apr 25, 2010 3:30pm',
    timestamp;

timestamp = Date.parse(str.replace(/[ap]m$/i, ''));

if(str.match(/pm$/i) >= 0) {
    timestamp += 12 * 60 * 60 * 1000;
}

10voto

Kamil Kiełczewski Punkte 69048

Leistung

Heute (2020.05.08) führe ich Tests für die gewählten Lösungen durch - für zwei Fälle: Eingabedatum ist ISO8601-String (Ad,Bd,Cd,Dd,Ed) und Eingabedatum ist Zeitstempel (At, Ct, Dt). Die Lösungen Bd,Cd,Ct liefern nicht js Date-Objekt als Ergebnis, aber ich füge sie hinzu, weil sie nützlich sein können, aber ich vergleiche sie nicht mit gültigen Lösungen. Diese Ergebnisse können für massive Datum Parsing nützlich sein.

Schlussfolgerungen

  • Lösung new Date (Ad) ist 50-100x schneller als moment.js (Dd) bei allen Browsern für ISO-Datum und Zeitstempel
  • Lösung new Date (Ad) ist ~10x schneller als parseDate (Ed)
  • Lösung Date.parse (Bd) ist am schnellsten, wenn man den Zeitstempel aus dem ISO-Datum in allen Browsern ermitteln will.

enter image description here

Einzelheiten

Ich führe den Test auf MacOs High Sierra 10.13.6 mit Chrome 81.0, Safari 13.1 und Firefox 75.0 durch. Lösung parseDate (Ed) verwenden new Date(0) und stellen Sie die UTC-Datumskomponenten manuell ein.

let ds = '2020-05-14T00:00Z'; // Valid ISO8601 UTC date
let ts = +'1589328000000';    // timestamp

let Ad = new Date(ds);
let Bd = Date.parse(ds);
let Cd = moment(ds);
let Dd = moment(ds).toDate();
let Ed = parseDate(ds);

let At = new Date(ts);
let Ct = moment(ts);
let Dt = moment(ts).toDate();

log = (n,d) => console.log(`${n}: ${+d} ${d}`);

console.log('from date string:', ds)
log('Ad', Ad);
log('Bd', Bd);
log('Cd', Cd);
log('Dd', Dd);
log('Ed', Ed);
console.log('from timestamp:', ts)
log('At', At);
log('Ct', Ct);
log('Dt', Dt);

function parseDate(dateStr) {
  let [year,month,day] = dateStr.split(' ')[0].split('-');
  let d=new Date(0);
  d.setUTCFullYear(year);
  d.setUTCMonth(month-1);
  d.setUTCDate(day)
  return d;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment-with-locales.min.js"></script>

This snippet only presents used soultions  

Ergebnisse für Chrom

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X