Wie kann ich Zeichenfolgen mit Formatangaben in JavaScript in datetime konvertieren?

207

Wie kann ich eine Zeichenfolge in ein Datums- / Uhrzeitobjekt in Javascript konvertieren, indem ich eine Formatzeichenfolge angeben?

Ich suche so etwas wie:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");
Serhat Ozgel
quelle
2
Übrigens können Punkte und Bindestriche als Datumstrennzeichen fehlschlagen. Schrägstriche sind in Ordnung. Daher akzeptiert Javascript (bis zu den Grenzen meiner Tests) "2011/08/22 10:30:00", jedoch noch nicht (trotz ISO 8601) "2011-09 -02 15:58:40 "was - wie behauptet wird - in Javascript 1.8.5 unterstützt wird.
Dave Everitt
Die Funktion Date.parse analysiert die Datumszeichenfolge im Format "MM / TT / JJJJ". Bitte konvertieren Sie die Zeichenfolge in das Format "MM / TT / JJJJ", bevor Sie Parse anwenden.
Warum nicht das Datum im gewünschten Format angeben? Ich mache es wie ein neues Datum ('2012 11 25 18:00:00'); und es funktioniert!
Foxybagga

Antworten:

88

Ich denke, das kann Ihnen helfen: http://www.mattkruse.com/javascript/date/

Es gibt eine getDateFromFormat()Funktion, die Sie ein wenig optimieren können, um Ihr Problem zu lösen.

Update: Eine aktualisierte Version der Beispiele finden Sie unter javascripttoolbox.com

Rafael Mueller
quelle
5
TypeError: Object Date has no method 'getDateFromFormat'
Derek 11 會 功夫
6
Die Methode getDateFromFormat ist im Dokument unter dem obigen Link verfügbar. Quelle hier verfügbar: mattkruse.com/javascript/date/source.html
Rafael Mueller
1
+1, gute Bibliothek ... reines Javascript ... es ist fantastisch. Vielen Dank
Surendra Jnawali
7
Beide Links sind tot
Sytham
1
Wenn Sie können, aktualisieren Sie bitte den Link. Das hilft nicht mehr.
Tallerlei
98

Verwenden Sie diese Option, wenn Ihre Zeichenfolge mit kompatibel ist . Wenn Ihr Format nicht kompatibel ist (ich denke es ist), müssen Sie die Zeichenfolge selbst analysieren (sollte mit regulären Ausdrücken einfach sein) und ein neues Datumsobjekt mit expliziten Werten für Jahr, Monat, Datum, Stunde, Minute und Sekunde erstellen .new Date(dateString)Date.parse()

Christoph
quelle
1
Date.parse ist die beste Lösung! Es analysiert fast alles! +1
Ianaz
7
@ianaz: FAST alles, was in Amerika verwendet wird, aber das fehlende Format, das von einem großen Teil Europas verwendet wird, ist "fast" zu groß. Das neue Datum ist jedoch eine gute Basis für benutzerdefinierte Funktionen.
Pavel V.
Das neue Datum (dateString) hat für mich einwandfrei funktioniert. Date.parse () wird stattdessen in Millisekunden konvertiert und gibt daher eine Zahl zurück, die kein Datumstyp ist.
Reagan Ochora
68

@Christoph Erwähnt die Verwendung eines regulären Ausdrucks, um das Problem anzugehen. Folgendes verwende ich:

var dateString = "2010-08-09 01:02:03";
var reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var dateArray = reggie.exec(dateString); 
var dateObject = new Date(
    (+dateArray[1]),
    (+dateArray[2])-1, // Careful, month starts at 0!
    (+dateArray[3]),
    (+dateArray[4]),
    (+dateArray[5]),
    (+dateArray[6])
);

Es ist keineswegs intelligent, konfigurieren Sie einfach den regulären Ausdruck und new Date(blah)passen Sie ihn Ihren Anforderungen an.

Bearbeiten: Vielleicht etwas verständlicher in ES6 mit Destrukturierung:

let dateString = "2010-08-09 01:02:03"
  , reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
  , [, year, month, day, hours, minutes, seconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds);

Aber ehrlich gesagt greife ich heutzutage nach etwas wie Moment

OrganicPanda
quelle
19
@ bažmegakapa anstatt zu weinen, hättest du vielleicht die Antwort bearbeiten und die 'var's' selbst hinzufügen können?
OrganicPanda
Warum benutzt du die /gFlagge, um lastIndexsie 0danach zu setzen ? Verwenden Sie einfach keine globale Übereinstimmung.
Ry-
1
@minitech Das /gwar ein schlampiges Kopieren / Einfügen aus einem vorhandenen Projekt. lastindexwurde von einem Editor hinzugefügt (um das zu bekämpfen, \gnehme ich an?). Ich werde sie jetzt entfernen. Vielen Dank für den Hinweis.
OrganicPanda
1
sehr schöne Antwort .. wirklich nützlich für mich
Jethik
14

In JavaScript gibt es keine ausgeklügelten Formatierungsroutinen für Datum und Uhrzeit.

Sie müssen eine externe Bibliothek für die formatierte Datumsausgabe verwenden. "JavaScript Date Format" von Flagrant Badassery sieht sehr vielversprechend aus.

Für die Eingabekonvertierung wurden bereits mehrere Vorschläge gemacht. :) :)

Tomalak
quelle
3
"muss" ist relativ. Natürlich können Sie Ihre eigene Implementierung erstellen. :)
Tomalak
13

Schauen Sie sich Moment.js an . Es ist eine moderne und leistungsstarke Bibliothek, die die traurigen Datumsfunktionen von JavaScript (oder deren Fehlen) ausgleicht.

Aaron Gray
quelle
3
Ich habe nicht abgelehnt, aber vielleicht wäre es schön gewesen, genau zu wissen, welche Funktion in Moment.js das gewünschte Verhalten ergibt (für uns faule Leute, die Moment.js bereits verwenden, aber die zu verwendende Funktion nicht kennen). .
Matt
Die Lokalisierung sieht vielversprechend aus. Wählen Sie ein mitteleuropäisches Gebietsschema für das Punktformat aus. Ich habe es jedoch nicht getestet und das vollständige Datum / Uhrzeit-Format ist nicht in den Beispielen enthalten, die ich gesehen habe.
Pavel V.
Ich habe nicht abgelehnt, aber ich wollte nur sagen, dass dies langsam ist. Für Desktop ok, aber für Handy möglicherweise zu langsam (je nach Ihren Anforderungen).
gabn88
11

Nur für eine aktualisierte Antwort hier gibt es eine gute js lib unter http://www.datejs.com/

Datejs ist eine Open-Source-JavaScript-Datumsbibliothek zum Parsen, Formatieren und Verarbeiten.

Alexis Abril
quelle
Diese Bearbeitung wurde rückgängig gemacht, obwohl sie sehr hilfreich ist, sollte sie als Kommentar oder separate Antwort hinzugefügt werden.
Alexis Abril
Es war sowieso zu lang für einen Kommentar, und das Hinzufügen einer doppelten Antwort ist falsch. Diese Frage hat über 155.000 Aufrufe - geben wir diesen Personen so viele Informationen wie möglich! (Übrigens - es ist in Stack Overflow sehr häufig, eine vorhandene Antwort zu bearbeiten - Sie würden sich wahrscheinlich schlechter fühlen, wenn ich nur Ihre Antwort kopiere ...)
Kobi
1
Und wenn Ihnen meine Bearbeitung nicht gefällt, ist das in Ordnung, aber bitte erweitern Sie Ihre Antwort - "Nur für eine aktualisierte Antwort hier" ist ein Füllstoff, und es fehlen einige Details. Diese Frage wird im Moment übrigens etwas beachtet , weshalb Sie plötzlich 5 Stimmen erhalten haben.
Kobi
7
var temp1 = "";
var temp2 = "";

var str1 = fd; 
var str2 = td;

var dt1  = str1.substring(0,2);
var dt2  = str2.substring(0,2);

var mon1 = str1.substring(3,5);
var mon2 = str2.substring(3,5);

var yr1  = str1.substring(6,10);  
var yr2  = str2.substring(6,10); 

temp1 = mon1 + "/" + dt1 + "/" + yr1;
temp2 = mon2 + "/" + dt2 + "/" + yr2;

var cfd = Date.parse(temp1);
var ctd = Date.parse(temp2);

var date1 = new Date(cfd); 
var date2 = new Date(ctd);

if(date1 > date2) { 
    alert("FROM DATE SHOULD BE MORE THAN TO DATE");
}
navin
quelle
5

Die externe Bibliothek ist ein Overkill für das Parsen von ein oder zwei Daten, daher habe ich meine eigene Funktion mit den Lösungen von Oli und Christoph erstellt . Hier in Mitteleuropa verwenden wir selten etwas anderes als das OP-Format, daher sollte dies für einfache Apps ausreichen, die hier verwendet werden.

function ParseDate(dateString) {
    //dd.mm.yyyy, or dd.mm.yy
    var dateArr = dateString.split(".");
    if (dateArr.length == 1) {
        return null;    //wrong format
    }
    //parse time after the year - separated by space
    var spacePos = dateArr[2].indexOf(" ");
    if(spacePos > 1) {
        var timeString = dateArr[2].substr(spacePos + 1);
        var timeArr = timeString.split(":");
        dateArr[2] = dateArr[2].substr(0, spacePos);
        if (timeArr.length == 2) {
            //minutes only
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]));
        } else {
            //including seconds
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]), parseInt(timeArr[2]))
        }
    } else {
        //gotcha at months - January is at 0, not 1 as one would expect
        return new Date(parseInt(dateArr[2]), parseInt(dateArr[1] - 1), parseInt(dateArr[0]));
    }
}
Pavel V.
quelle
4

Date.parse() ist ziemlich intelligent, aber ich kann nicht garantieren, dass das Format korrekt analysiert wird.

Wenn nicht, müssten Sie etwas finden, um die beiden zu überbrücken. Ihr Beispiel ist ziemlich einfach (es handelt sich nur um Zahlen), sodass Sie mit einem Hauch von REGEX (oder sogar string.split()- möglicherweise schneller) in Kombination mit einigen parseInt()schnell ein Datum festlegen können .

Oli
quelle
3
time = "2017-01-18T17:02:09.000+05:30"

t = new Date(time)

hr = ("0" + t.getHours()).slice(-2);
min = ("0" + t.getMinutes()).slice(-2);
sec = ("0" + t.getSeconds()).slice(-2);

t.getFullYear()+"-"+t.getMonth()+1+"-"+t.getDate()+" "+hr+":"+min+":"+sec
puneet18
quelle
plus 1 nach dem Aufruf der Funktion getmonth () scheint falsch
Arjunsingh
t.getMonth () + 1 ist korrekt, da Date.getMonth () einen auf 0 basierenden Wert zurückgibt.
Jussi Palo
3

Nur um meine 5 Cent zu geben.

Mein Datumsformat ist TT.MM.JJJJ (UK-Format) und keines der oben genannten Beispiele hat für mich funktioniert. Alle Parser betrachteten mm als Tag und dd als Monat.

Ich habe diese Bibliothek gefunden: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ und es hat funktioniert, weil Sie die Reihenfolge der Felder wie folgt sagen können:

>>console.log(new Date(Date.fromString('09.05.2012', {order: 'DMY'})));
Wed May 09 2012 00:00:00 GMT+0300 (EEST)

Ich hoffe das hilft jemandem.

Anton Valqk
quelle
Links jetzt tot!
Nun ... ein kurzes archive.org zeigte: bitbucket.org/mazzarelli/js-date/downloads ist die Projekt-URL.
Anton Valqk
1

Moment.js wird dies erledigen:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;
Chintsu
quelle
1
Während moment.js großartig ist, gibt es eine Vielzahl von Anwendungsfällen, in denen Sie nur natives Javascript verwenden müssen. Mein aktueller Anwendungsfall ist eine Kartenfunktion in CouchDB
Zach Smith
1

Sie können hierfür die Bibliothek moment.js verwenden. Ich verwende nur, um eine zeitspezifische Ausgabe zu erhalten, aber Sie können auswählen, welche Art von Format Sie auswählen möchten.

Referenz:

1. Moment Bibliothek: https://momentjs.com/

2. Zeit- und datumsspezifische Funktionen: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

convertDate(date) {
        var momentDate = moment(date).format('hh : mm A');
        return momentDate;
}

und Sie können diese Methode wie folgt aufrufen:

this.convertDate('2020-05-01T10:31:18.837Z');

Ich hoffe, es hilft. Viel Spaß beim Codieren.

Amit Pandya
quelle
0

Wenn Sie die Konjunkturzeichenfolge Date.parse vollständig in das Format TT-MM-JJJJ wie in RFC822 angegeben konvertieren, kann es zu Fehlern kommen, wenn Sie die Analyse JJJJ-MM-TT verwenden.

Valentin Rusk
quelle
Zu Ihrer Information, aus RFC 822 (Seite: 25. Teilweise gereinigt, um die Textlänge für einen Kommentar zu erfüllen): 13. August 1982 - 25 - RFC # 822 5. DATUM- UND ZEITSPEZIFIKATION 5.1. SYNTAX Datum-Uhrzeit = [Tag ","] Datum Uhrzeit; TT MM JJ HH: MM: SS ZZZ Tag = "Mo" / "Di" / "Mi" / "Do" / "Fr" / "Sa" / "So" Datum = 1 * 2DIGIT Monat 2DIGIT; Tag Monat Jahr zB 20 Jun 82 Monat = "Jan" / "Feb" / "Mar" / "Apr" / "Mai" / "Jun" / "Jul" / "Aug" / "Sep" / "Okt" / " Nov "/" Dec "
Valentin Rusk
0
//Here pdate is the string date time
var date1=GetDate(pdate);
    function GetDate(a){
        var dateString = a.substr(6);
        var currentTime = new Date(parseInt(dateString ));
        var month =("0"+ (currentTime.getMonth() + 1)).slice(-2);
        var day =("0"+ currentTime.getDate()).slice(-2);
        var year = currentTime.getFullYear();
        var date = day + "/" + month + "/" + year;
        return date;
    }
Abhishek Kanrar
quelle
Der Abfrager hat nach einer Formatzeichenfolge gefragt .
Armali
@Armali Eingabeparameter wie "/ Date (1552415400000) /" im Zeichenfolgenformat
Abhishek Kanrar