2009-01-24 8 views
182

Wie kann ich einen String in ein Datum-Zeit-Objekt in Javascript konvertieren, indem Sie eine Formatzeichenfolge angeben?Wie kann ich String in Datetime mit Formatangabe in JavaScript konvertieren?

ich nach etwas suchen, wie:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss"); 
+2

BTW Punkte und Bindestriche als Datumstrenn ausfallen können, Schrägstriche in Ordnung sind, so (an die Grenzen meiner Tests) wird Javascript akzeptieren „2011/08/22 10:30:00 "aber noch nicht (trotz ISO 8601)" 2011-09-02 15:58:40 "was - es wird behauptet - wird in Javascript 1.8.5 unterstützt. –

+0

Date.parse-Funktion analysiert die Datumszeichenfolge im Format "MM/TT/JJJJ". Bitte konvertieren Sie die Zeichenfolge in das Format "MM/TT/JJJJ", bevor Sie Parse anwenden. –

+0

Warum liefern Sie das Datum nicht im gewünschten Format? Ich mache es wie neu Datum ('2012 11 25 18:00:00'); und es funktioniert! – foxybagga

Antwort

88

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

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

Update: es gibt eine aktualisierte Version der verfügbaren Proben bei javascripttoolbox.com

+5

'TypeError: Objekt Datum hat keine Methode 'getDateFromFormat'' –

+4

Die Methode getDateFromFormat ist mit dem Dokument verfügbar, auf dem obigen Link. Quelle hier verfügbar: http://www.mattkruse.com/javascript/date/source.html –

+1

+1, gute Bibliothek ... .pure Javascript ... es ist fantastisch. danke –

81

Verwenden new Date(dateString) wenn Ihr String ist mit Date.parse() kompatibel. Wenn Ihr Format inkompatibel ist (ich denke es ist), müssen Sie die Zeichenfolge selbst analysieren (sollte mit regulären Ausdrücken leicht sein) und eine new Date object mit expliziten Werten für Jahr, Monat, Datum, Stunde, Minute und Sekunde erstellen.

+1

Date.parse ist die beste Lösung! Es parsen fast alles! +1 – ianaz

+5

@ianaz: Fast alles in Amerika verwendet, aber fehlt das Format von großen Teilen Europas ist zu groß "fast". Aber das neue Datum ist eine gute Grundlage für benutzerdefinierte Funktionen. –

+0

new Date (dateString) funktionierte für mich gut, Date.parse() konvertiert stattdessen in Millisekunden und gibt so eine Zahl zurück, nicht einen Date-Typ. – drochora

3

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

Wenn nicht, müssten Sie etwas finden, um die beiden zu überbrücken. Ihr Beispiel ist ziemlich einfach (da es sich um reine Zahlen handelt), so dass Sie mit einem Touch von REGEX (oder sogar string.split() - möglicherweise schneller) mit einigen parseInt() Daten schnell erstellen können.

14

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

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

Für die Eingangskonvertierung wurden bereits einige Vorschläge gemacht. :)

+3

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

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

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

+0

Gerollt zurück, die Bearbeitung, obwohl sehr hilfreich, sollte es als Kommentar oder separate Antwort hinzugefügt werden. –

+0

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 Leuten so viele Informationen wie möglich! (Übrigens - es ist sehr üblich in Stack Overflow eine vorhandene Antwort zu bearbeiten - Sie würden sich wahrscheinlich schlechter fühlen, wenn ich Ihre Antwort einfach kopieren würde ...) – Kobi

+0

Und überhaupt, wenn Sie meine Bearbeitung nicht mögen, 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 bekommt [etwas Aufmerksamkeit] (http://meta.stackexchange.com/questions/145301/what-can-be-done-with-a-blantant-wrong-answer-to-a-opopular-question) der Moment übrigens, aus dem Sie plötzlich 5 Stimmen bekommen haben. – Kobi

55

@ Christoph eine Regex Mentions mit dem Problem zu begegnen. Hier ist, was ich verwende:

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 nur die Regex und new Date(blah) an Ihre Bedürfnisse anzupassen.

Edit: Vielleicht ein bisschen mehr verständlich 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 in aller Ehrlichkeit in diesen Tagen ich für so etwas wie Moment erreichen

+17

@ bažmegakapa anstatt zu weinen könnten Sie vielleicht die Antwort bearbeitet und die 'vars' selbst hinzugefügt haben? – OrganicPanda

+2

Ich muss zugeben, dass Sie Recht haben. BTW, Downvote entfernt. – kapa

+0

Warum benutzen Sie das '/ g' Flag, nur um' lastIndex' danach auf '0' zu setzen? Verwenden Sie kein globales Match. – Ryan

0

Um die Date.parse convert String vollständig erfüllen zu formatieren TT-MM-YYYY wie in RFC822, angegeben, wenn Sie jyyy-mm-dd Parse verwenden, kann ein Fehler machen.

+0

FYI, aus RFC 822 (Seite: 25. Teilweise gereinigt, Textlänge für Kommentar zu erfüllen): 13. August 1982 - 25 - RFC# 822 5. DATUM UND ZEIT SPEZIFIKATION 5.1.SYNTAX Datum-Uhrzeit = [Tag ","] Datum Uhrzeit; tt mm yy hh: mm: ss zzz Tag = "Mo"/"Di"/"Mi"/"Do"/"Fr"/"Sa"/"So" Datum = 1 * 2DIGIT Monat 2DIGIT; Tag Monat Jahr z.B. 20 Jun 82 Monat = "Jan"/"Feb"/"Mar"/"Apr"/"Mai"/"Jun"/"Jul"/"Aug"/"Sep"/"Okt"/"Nov"/"Dec" –

2

Nur um meine 5 Cent zu geben.

Mein Datumsformat ist dd.mm.yyyy (UK-Format) und keines der oben genannten Beispiele funktionierte für mich. Alle Parser betrachteten mm als Tag und Tag 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:

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

Ich hoffe, dass jemand hilft.

+0

Links jetzt tot! –

+0

Nun ... ein schnelles Archiv.org zeigte: https://bitbucket.org/mazzarelli/js-date/downloads/ ist die Projekt-URL. –

12

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

+3

Ich habe nicht downvote, aber vielleicht wäre es schön gewesen, genau zu wissen, welche Funktion in Moment.js das gewünschte Verhalten geben würde (für uns faule Leute, die Moment.js bereits benutzen, aber die spezielle Funktion nicht kennen). – Matt

+0

Die Lokalisierung sieht vielversprechend aus, wählen Sie ein beliebiges zentraleuropä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, die ich gesehen habe. –

+0

Ich habe nicht downvote, aber ich wollte nur sagen, dass das langsam ist. Für den Desktop ok, aber für mobile könnte zu langsam sein (je nach Ihren Bedürfnissen). – gabn88

3

Externe Bibliothek ist ein Overkill für die Analyse von ein oder zwei Daten, so habe ich meine eigene Funktion mit Oli's und Christoph's Lösungen. Hier in Mitteleuropa verwenden wir selten etwas anderes als das OP-Format, also 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])); 
    } 
} 
0

Moment.js wird dies handhaben:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss'); 
var date = momentDate.; 
+1

Während moment.js großartig ist, gibt es eine Fülle von Anwendungsfällen, in denen Sie nur natives Javascript verwenden müssen. Mein aktueller Anwendungsfall ist eine Kartenfunktion in CouchDB –

0
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