Konvertieren einer Zeichenfolge in ein Datum in JavaScript

667

Wie kann ich eine Zeichenfolge in JavaScript in ein Datum konvertieren?

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

var dt_st= //st in date format same as dt
jslearner
quelle
3
Mögliches Duplikat der Konvertierung von Java-Datenstring in Javascript-Datum und vieles mehr
Felix Kling
1
Oh, ich bin jetzt verwirrt. Willst du Date -> Stringoder String -> Date?
Felix Kling
10
Betrachten Sie momentjs.com
Hanshenrik

Antworten:

826

Das beste Zeichenfolgenformat für die Zeichenfolgenanalyse ist das Datums-ISO-Format zusammen mit dem JavaScript-Datumsobjektkonstruktor.

Beispiele für das ISO-Format: YYYY-MM-DDoder YYYY-MM-DDTHH:MM:SS.

Aber warte! Nur das "ISO-Format" zu verwenden, funktioniert von sich aus nicht zuverlässig. Zeichenfolgen werden manchmal als UTC und manchmal als Ortszeit analysiert (basierend auf dem Hersteller und der Version des Browsers). Die beste Vorgehensweise sollte immer darin bestehen, Daten als UTC zu speichern und Berechnungen als UTC durchzuführen.

Um ein Datum als UTC zu analysieren, fügen Sie ein Z hinzu - z new Date('2011-04-11T10:20:30Z'). B.: .

Um ein Datum in UTC anzuzeigen, verwenden Sie .toUTCString(),
um ein Datum in der Ortszeit des Benutzers anzuzeigen, verwenden Sie .toString().

Weitere Infos zu MDN | Datum und diese Antwort .

Aus Gründen der alten Internet Explorer-Kompatibilität (IE-Versionen unter 9 unterstützen das ISO-Format im Datumskonstruktor nicht) sollten Sie die Datetime-Zeichenfolgendarstellung in ihre Teile aufteilen und dann den Konstruktor mit Datetime-Teilen verwenden, z new Date('2011', '04' - 1, '11', '11', '51', '00'). Beachten Sie, dass die Nummer des Monats 1 weniger sein muss.


Alternative Methode - Verwenden Sie eine geeignete Bibliothek:

Sie können auch die Bibliothek Moment.js nutzen , mit der das Datum mit der angegebenen Zeitzone analysiert werden kann.

Pavel Hodek
quelle
Ich musste auch die "Split the String" -Methode für eine Safari für das gleiche "Nan" -Problem verwenden, das Paul Tomblin angesprochen hatte. Das neue Datum ('2011-04-11 11:51:00') würde das 'ungültige Datum' zurückgeben.
Amos
1
@Amos: Beachten Sie den Buchstaben T, der Datum und Uhrzeit trennt. Wenn Sie schreiben, ist new Date('2011-04-11T11:51:00')das Erstellungsdatum gültig.
Pavel Hodek
Leider bin ich auf das Problem gestoßen, dass * es nicht für ALLE Benutzer funktioniert .
Roman Podlinov
3
Das Parsen einer Zeichenfolge durch Date ist der schlechteste Weg, um ein Date-Objekt zu erstellen. Es ist weitaus besser, die Zeichenfolge manuell zu analysieren und Date als Konstruktor aufzurufen. Einige Browser behandeln eine ISO-Zeichenfolge ohne Zeitzone als UTC, andere als lokal.
RobG
6
@ Ben Taliadoros: Ja, es ist in allen gängigen Browsern new Date('1970-30-02')ungültig, das Datum ist ungültig, da ein Jahr keine 30 Monate hat. Sie können keine Monate überlaufen lassen, aber wenn Sie Tage überlaufen, wird dies in Chrome und Firefox auf ein gültiges Datum aufgelöst: new Date('1970-02-30')Dies ist der gleiche Tag wie das neue Datum ('1970-03-02').
Pavel Hodek
291

Leider habe ich das herausgefunden

var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());

gibt "Mi Apr 02 2014" zurück. Ich weiß, dass es verrückt klingt, aber es passiert für einige Benutzer.

Die kugelsichere Lösung ist die folgende:

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

Roman Podlinov
quelle
45
Es ist überhaupt nicht verrückt, die Anpassung wird höchstwahrscheinlich durch das Einsetzen der Sommerzeit verursacht . Daten im Format von yyyy-MM-ddwerden als UTC analysiert und toString gibt die Ortszeit zurück, sodass je nach Zeitzone des Benutzers definitiv unterschiedliche Ergebnisse zurückgegeben werden können. Wenn Sie immer die Zeit als UTC wünschen, sollten Sie toUTCString verwenden .
James
Ich habe meinen Kopf auf diesen geschlagen. Dies scheint zu funktionieren, aber ich verstehe nicht, warum Sie Teile [0] -1 und nicht nur Teile [0] verwendet haben.
Adam Youngers
4
@AdamYoungers Aufgrund von Javascript zählt Monate von 0: Januar - 0, Februar - 1 usw.
Roman Podlinov
1
Diese Antwort deutet darauf hin, dass das Verhalten im Beispiel falsch ist. Gemäß der Spezifikation: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… (siehe: datestring) wäre der ausgegebene Wert im Beispiel korrekt
James Ross
124
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));

Und die Ausgabe wird sein:

dt => Date {Fri Apr 26 2013}
serega386
quelle
5
Leider gibt es ein Problem mit dieser Lösung. Details hier: stackoverflow.com/questions/17959660/…
Roman Podlinov
Die Ausgabe ist unbekannt, da Ihr Code weder etwas in eine Zeichenfolge konvertiert noch etwas ausgibt.
Robert Siemer
81
function stringToDate(_date,_format,_delimiter)
{
            var formatLowerCase=_format.toLowerCase();
            var formatItems=formatLowerCase.split(_delimiter);
            var dateItems=_date.split(_delimiter);
            var monthIndex=formatItems.indexOf("mm");
            var dayIndex=formatItems.indexOf("dd");
            var yearIndex=formatItems.indexOf("yyyy");
            var month=parseInt(dateItems[monthIndex]);
            month-=1;
            var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
            return formatedDate;
}

stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")
Kassem
quelle
3
Handles stammt aus jeder Variation, nicht nur aus der US-Formatierung
Mark Jones
4
@MarkJones Vertrauen Sie der .indexOf()Methode nicht, da sie ohne Polydateien nicht browserübergreifend kompatibel ist. Verwenden Sie stattdessen die kompatibleren .match()oder .test()Vanilla JS-Methoden.
Alexander Dixon
1
Wenn Sie var _delimiter = _format.match(/\W/g)[0];zu Beginn der Funktion hinzufügen, können Sie das Trennzeichen automatisch abrufen und den 3. Parameter vorab festlegen.
Campsjos
39

moment.js ( http://momentjs.com/ ) ist ein vollständiges und gutes Paket für Verwendungsdaten und unterstützt ISO 8601-Zeichenfolgen .

Sie können ein Datum und ein Format für eine Zeichenfolge hinzufügen.

moment("12-25-1995", "MM-DD-YYYY");

Und Sie können überprüfen, ob ein Datum gültig ist.

moment("not a real date").isValid(); //Returns false

Einige Anzeigebeispiele

let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL')) 
// output: "3 months ago | February 1, 2019"

Siehe Dokumentation http://momentjs.com/docs/#/parsing/string-format/

Empfehlung: Ich empfehle, ein Paket für Daten zu verwenden, die viele Formate enthalten, da die Zeitzonen- und Formatzeitverwaltung wirklich ein großes Problem darstellt, sobald viele Formate gelöst werden. Sie könnten das Datum leicht von einer einfachen Zeichenfolge bis heute analysieren, aber ich denke, das ist eine harte Arbeit, um alle Formate und Variationen von Daten zu unterstützen.

Juan Caicedo
quelle
1
Einige Anzeigebeispiele let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL')) Ausgaben: "vor 3 Monaten | 1. Februar 2019"
CPHPython
36

Übergeben Sie es als Argument an Date ():

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

Sie können auf Datum, Monat und Jahr zugreifen, indem Sie beispielsweise Folgendes verwenden : dt.getMonth().

obligatorisch
quelle
8
Ich tue console.log(new Date('30-08-2018'))und bekomme ungültiges Datum
Dwigh
Diese Antwort ignoriert mehrere Komplexitäten dieses Problems. Wenn ich dies beispielsweise für ein Datum 01/02/2020auf meinem Computer (in Großbritannien) mache, wird der 1. Februar zurückgegeben, und als ob in den USA dasselbe getan wird, wird der 2. Januar zurückgegeben. Sie sollten diese naive Implementierung so gut wie nie verwenden. Verwenden Sie stattdessen Moment .
Liam
23

Wenn Sie die großartige Moment- Bibliothek verwenden können (z. B. in einem Node.js-Projekt), können Sie Ihr Datum einfach mit z

var momentDate = moment("2014-09-15 09:00:00");

und kann über auf das JS-Datumsobjekt zugreifen

momentDate ().toDate();
H6.
quelle
5
Bitte beachten Sie, dass Moment ohne Knoten gut
funktioniert
Ich habe einen NaN-Fehler in meinen Android- und IOS-Geräten erhalten, als ich diesen Code verwendet habe, aber er funktionierte auf dem Desktop. Hier ist der Code, den ich zuvor verwendet habe: var dateTimeOfTimeIn = neues Datum (Jahr + "-" + Monat + "-" + Tag + "T" + data.timeIn); Mit diesem Ansatz und dieser Momentbibliothek wurde mein Problem gelöst und mein Code funktioniert jetzt auf allen meinen Geräten einwandfrei!
Mehdi
20

new Date(2000, 10, 1) erhalten Sie "Mi Nov 01 2000 00:00:00 GMT + 0100 (CET)"

Sehen Sie, dass 0 für Monat Ihnen Januar gibt

Torsten Becker
quelle
18

Für diejenigen, die nach einer winzigen und intelligenten Lösung suchen:

String.prototype.toDate = function(format)
{
  var normalized      = this.replace(/[^a-zA-Z0-9]/g, '-');
  var normalizedFormat= format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');
  var formatItems     = normalizedFormat.split('-');
  var dateItems       = normalized.split('-');

  var monthIndex  = formatItems.indexOf("mm");
  var dayIndex    = formatItems.indexOf("dd");
  var yearIndex   = formatItems.indexOf("yyyy");
  var hourIndex     = formatItems.indexOf("hh");
  var minutesIndex  = formatItems.indexOf("ii");
  var secondsIndex  = formatItems.indexOf("ss");

  var today = new Date();

  var year  = yearIndex>-1  ? dateItems[yearIndex]    : today.getFullYear();
  var month = monthIndex>-1 ? dateItems[monthIndex]-1 : today.getMonth()-1;
  var day   = dayIndex>-1   ? dateItems[dayIndex]     : today.getDate();

  var hour    = hourIndex>-1      ? dateItems[hourIndex]    : today.getHours();
  var minute  = minutesIndex>-1   ? dateItems[minutesIndex] : today.getMinutes();
  var second  = secondsIndex>-1   ? dateItems[secondsIndex] : today.getSeconds();

  return new Date(year,month,day,hour,minute,second);
};

Beispiel:

"22/03/2016 14:03:01".toDate("dd/mm/yyyy hh:ii:ss");
"2016-03-29 18:30:00".toDate("yyyy-mm-dd hh:ii:ss");
Arivan Bastos
quelle
Klappt wunderbar! Du hast mein Leben gerettet, Alter!
Steve Nosse
15

Gerade new Date(st);

Vorausgesetzt, es ist das richtige Format .

Mark Kahn
quelle
Beste und einfachste Lösung
Ahmed Ghrib
12

Wenn Sie aus dem 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 unter 9.

Alexandre N.
quelle
12

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
Glückliche Soni
quelle
1
Was ist mit dem undefinedWert? Wie : var date = new Date(undefined)?
Benny Neugebauer
@BennyNeugebauer Überprüfen Sie, ob ein Wert undefiniert ist, bevor Sie versuchen, ihn an den Date-Konstruktor zu übergeben. Vielleicht möchten Sie eine Ausnahme auslösen oder auf ein Standarddatum zurückgreifen, wer weiß?
Lucky Soni
9

Date.parsebringt dir fast was du willst. Es verschluckt sich am am/ pmTeil, aber mit einigem Hacken 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;
}
niksvp
quelle
6

In das Format pt-BR konvertieren:

    var dateString = "13/10/2014";
    var dataSplit = dateString.split('/');
    var dateConverted;

    if (dataSplit[2].split(" ").length > 1) {

        var hora = dataSplit[2].split(" ")[1].split(':');
        dataSplit[2] = dataSplit[2].split(" ")[0];
        dateConverted = new Date(dataSplit[2], dataSplit[1]-1, dataSplit[0], hora[0], hora[1]);

    } else {
        dateConverted = new Date(dataSplit[2], dataSplit[1] - 1, dataSplit[0]);
    }

Ich hoffe jemandem zu helfen !!!

Marcelo Rebouças
quelle
5

Ich habe eine Geige dafür erstellt. Sie können die Funktion toDate () für jede Datumszeichenfolge verwenden und das Datumsformat angeben. Dadurch erhalten Sie ein Datumsobjekt. https://jsfiddle.net/Sushil231088/q56yd0rp/

"17/9/2014".toDate("dd/MM/yyyy", "/")
Sushil Mahajan
quelle
4

Für die Konvertierung von Zeichenfolgen in js verwende ich http://momentjs.com/

moment().format('MMMM Do YYYY, h:mm:ss a'); // August 16th 2015, 4:17:24 pm
moment().format('dddd');                    // Sunday
moment().format("MMM Do YY");               // Aug 16th 15
moment().format('YYYY [escaped] YYYY');     // 2015 escaped 2015
moment("20111031", "YYYYMMDD").fromNow(); // 4 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow();        // 16 hours ago
moment().endOf('day').fromNow();          // in 8 hours
Alexey Popov
quelle
1
moment () nimmt standardmäßig das aktuelle Datum an. So formatieren Sie eine Zeichenfolge im Format "2016-06-27 17: 49: 51.951602 + 05: 30" mit moment.
Zoran777
4

Ich habe diese Funktion gemacht, um jedes Date-Objekt in ein UTC-Date-Objekt zu konvertieren.

function dateToUTC(date) {
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}


dateToUTC(new Date());
Andy
quelle
3

Noch eine andere Möglichkeit:

String.prototype.toDate = function(format) {
    format = format || "dmy";
    var separator = this.match(/[^0-9]/)[0];
    var components = this.split(separator);
    var day, month, year;
    for (var key in format) {
        var fmt_value = format[key];
        var value = components[key];
        switch (fmt_value) {
            case "d":
                day = parseInt(value);
                break;
            case "m":
                month = parseInt(value)-1;
                break;
            case "y":
                year = parseInt(value);
        }
    }
    return new Date(year, month, day);
};
a = "3/2/2017";
console.log(a.toDate("dmy"));
// Date 2017-02-03T00:00:00.000Z
Mackraken
quelle
Ah! Ordentlich! Endlich ein Code, der sich um das verwendete Trennzeichen kümmert.
Sam Sirry
3

Sie können dies versuchen:

function formatDate(userDOB) {
  const dob = new Date(userDOB);

  const monthNames = [
    'January', 'February', 'March', 'April', 'May', 'June', 'July',
     'August', 'September', 'October', 'November', 'December'
  ];

  const day = dob.getDate();
  const monthIndex = dob.getMonth();
  const year = dob.getFullYear();

  // return day + ' ' + monthNames[monthIndex] + ' ' + year;
  return `${day} ${monthNames[monthIndex]} ${year}`;
}

console.log(formatDate('1982-08-10'));

Syed
quelle
2
var date = new Date(year, month, day);

oder

var date = new Date('01/01/1970');

Datumszeichenfolge im Format '01 -01-1970 'funktioniert in FireFox nicht. Verwenden Sie daher besser "/" anstelle von "-" in der Datumsformatzeichenfolge.

Ravi
quelle
Mein String ist "2015/08/03 13:06:16" Strill in FF funktioniert nicht
Dhara
2

Wenn Sie den Inhalt der Zeichenfolge überprüfen müssen, bevor Sie in das Datumsformat konvertieren:

// Convert 'M/D/YY' to Date()
mdyToDate = function(mdy) {
  var d = mdy.split(/[\/\-\.]/, 3);

  if (d.length != 3) return null;

  // Check if date is valid
  var mon = parseInt(d[0]), 
      day = parseInt(d[1]),
      year= parseInt(d[2]);
  if (d[2].length == 2) year += 2000;
  if (day <= 31 && mon <= 12 && year >= 2015)
    return new Date(year, mon - 1, day);

  return null; 
}
Adriano P.
quelle
2

Ich habe die Funktion parseDateTime erstellt, um die Zeichenfolge in ein Datumsobjekt zu konvertieren, und sie funktioniert in allen Browsern (einschließlich IE-Browser). Überprüfen Sie, ob jemand erforderlich ist, und verweisen Sie auf https://github.com/Umesh-Markande/Parse-String-to-Date -in-all-browser

    function parseDateTime(datetime) {
            var monthNames = [
                "January", "February", "March",
                "April", "May", "June", "July",
                "August", "September", "October",
                "November", "December"
              ];
            if(datetime.split(' ').length == 3){
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1].replace('.00','');
                var timearray = time.split(':');
                var hours = parseInt(time.split(':')[0]);
                var format = datetime.split(' ')[2];
                var bits = date.split(/\D/);
                date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = date.getDate();
                var monthIndex = date.getMonth();
                var year = date.getFullYear();
                if ((format === 'PM' || format === 'pm') && hours !== 12) {
                    hours += 12;
                    try{  time = hours+':'+timearray[1]+':'+timearray[2] }catch(e){ time = hours+':'+timearray[1] }
                } 
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            }else if(datetime.split(' ').length == 2){
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1];
                var bits = date.split(/\D/);
                var datetimevalue = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = datetimevalue.getDate();
                var monthIndex = datetimevalue.getMonth();
                var year = datetimevalue.getFullYear();
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            }else if(datetime != ''){
                var bits = datetime.split(/\D/);
                var date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                return date;
            }
            return datetime;
        }

    var date1 = '2018-05-14 05:04:22 AM';   // yyyy-mm-dd hh:mm:ss A
    var date2 = '2018/05/14 05:04:22 AM';   // yyyy/mm/dd hh:mm:ss A
    var date3 = '2018/05/04';   // yyyy/mm/dd
    var date4 = '2018-05-04';   // yyyy-mm-dd
    var date5 = '2018-05-14 15:04:22';   // yyyy-mm-dd HH:mm:ss
    var date6 = '2018/05/14 14:04:22';   // yyyy/mm/dd HH:mm:ss

    console.log(parseDateTime(date1))
    console.log(parseDateTime(date2))
    console.log(parseDateTime(date3))
    console.log(parseDateTime(date4))
    console.log(parseDateTime(date5))
    console.log(parseDateTime(date6))

**Output---**
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Mon May 14 2018 15:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 14:04:22 GMT+0530 (India Standard Time)
Umesh Markande
quelle
Dieser hat für mich gearbeitet. Vielen Dank.
Chris D. Emerson
2

Diese Antwort basiert auf Kassems Antwort, behandelt aber auch zweistellige Jahre. Ich habe Kassems Antwort bearbeitet, aber falls sie nicht genehmigt wurde, sende ich sie auch als separate Antwort.

function stringToDate(_date,_format,_delimiter) {
        var formatLowerCase=_format.toLowerCase();
        var formatItems=formatLowerCase.split(_delimiter);
        var dateItems=_date.split(_delimiter);
        var monthIndex=formatItems.indexOf("mm");
        var dayIndex=formatItems.indexOf("dd");
        var yearIndex=formatItems.indexOf("yyyy");
        var year = parseInt(dateItems[yearIndex]); 
        // adjust for 2 digit year
        if (year < 100) { year += 2000; }
        var month=parseInt(dateItems[monthIndex]);
        month-=1;
        var formatedDate = new Date(year,month,dateItems[dayIndex]);
        return formatedDate;
}

stringToDate("17/9/14","dd/MM/yyyy","/");
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")
Daniel Patru
quelle
1

Sie können Regex verwenden, um Zeichenfolgen auf die Detailzeit zu analysieren und dann ein Datum oder ein beliebiges Rückgabeformat wie das folgende zu erstellen:

//example : let dateString = "2018-08-17 01:02:03.4"

function strToDate(dateString){
    let reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{1})/
  , [,year, month, day, hours, minutes, seconds, miliseconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds, miliseconds);
  return dateObject;
}
alert(strToDate(dateString));
TungHarry
quelle
1

Performance

Heute (2020.05.08) führe ich Tests für ausgewählte Lösungen durch - für zwei Fälle: Das Eingabedatum ist die ISO8601-Zeichenfolge (Anzeige, Bd, Cd, Dd, Ed) und das Eingabedatum ist der Zeitstempel (At, Ct, Dt). Die Lösungen Bd, Cd, Ct geben das js Date-Objekt nicht als Ergebnis zurück, 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 eine umfassende Datumsanalyse hilfreich sein.

Schlussfolgerungen

  • Solution new Date(Ad) ist 50-100x schneller als moment.js (Dd) für alle Browser für ISO-Datum und Zeitstempel
  • Lösung new Date(Anzeige) ist ~ 10x schneller als parseDate(Ed)
  • Die Lösung Date.parse(Bd) ist am schnellsten, wenn in allen Browsern ein Zeitstempel vom ISO-Datum abgerufen werden muss

Geben Sie hier die Bildbeschreibung ein

Einzelheiten

Ich führe einen Test auf MacOs High Sierra 10.13.6 unter Chrome 81.0, Safari 13.1, Firefox 75.0 durch. Lösung parseDate(Ed) Verwenden new Date(0)und manuelles Einstellen von UTC-Datumskomponenten.

Ergebnisse für Chrom

Geben Sie hier die Bildbeschreibung ein

Kamil Kiełczewski
quelle
0

ISO 8601-ähnliche Datestrings, so hervorragend der Standard auch ist, werden immer noch nicht allgemein unterstützt.

Dies ist eine großartige Ressource, um herauszufinden, welches Datestring-Format Sie verwenden sollten:

http://dygraphs.com/date-formats.html

Ja, das bedeutet, dass Ihr Datenstring so einfach sein kann wie im Gegensatz zu

"2014/10/13 23:57:52" anstatt "2014-10-13 23:57:52"

Taveras
quelle
0
                //little bit of code for Converting dates 

                var dat1 = document.getElementById('inputDate').value;
                var date1 = new Date(dat1)//converts string to date object
                alert(date1);
                var dat2 = document.getElementById('inputFinishDate').value;
                var date2 = new Date(dat2)
                alert(date2);
Pec1983
quelle
0

benutze diesen Code: (mein Problem wurde mit diesem Code gelöst)

function dateDiff(date1, date2){
var diff = {}                           // Initialisation du retour
var tmp = date2 - date1;

tmp = Math.floor(tmp/1000);             // Nombre de secondes entre les 2 dates
diff.sec = tmp % 60;                    // Extraction du nombre de secondes

tmp = Math.floor((tmp-diff.sec)/60);    // Nombre de minutes (partie entière)
diff.min = tmp % 60;                    // Extraction du nombre de minutes

tmp = Math.floor((tmp-diff.min)/60);    // Nombre d'heures (entières)
diff.hour = tmp % 24;                   // Extraction du nombre d'heures

tmp = Math.floor((tmp-diff.hour)/24);   // Nombre de jours restants
diff.day = tmp;

return diff;

}}

Fetra
quelle
3
Bitte erklären Sie Ihre Antwort
Mazz
Die Parameter date1 und date2 müssen das Format als Datumsrecht haben.
Fetra
das Rückgabedatum der Funktion mit dem Namen diff. Wenn Sie möchten, dass die Anzahl der zurückgegebenen Tage einfach so ist: var result = dateDiff (date1, date2); var day_number = result.day; es ist einfach
Fetra
0

Ich habe eine wiederverwendbare Funktion geschrieben, die ich verwende, wenn ich Datumszeichenfolgen vom Server erhalte.
Sie können das gewünschte Trennzeichen (/ - etc ..) übergeben, das den Tag Monat und Jahr trennt, um die split()Methode zu verwenden.
Sie können es an diesem Arbeitsbeispiel sehen und testen .

<!DOCTYPE html>
<html>
  <head>
    <style>
    </style>
  </head>
  <body>
    <div>
      <span>day:
      </span> 
      <span id='day'>
      </span>
    </div>
    <div>
      <span>month:
      </span> 
      <span id='month'>
      </span>
    </div>
    <div>
      <span>year:
      </span> 
      <span id='year'>
      </span>
    </div>
    <br/>
    <input type="button" id="" value="convert" onClick="convert('/','28/10/1980')"/>
    <span>28/10/1980
    </span>
    <script>
      function convert(delimiter,dateString)
      {
        var splitted = dateString.split('/');
        // create a new date from the splitted string 
        var myDate = new Date(splitted[2],splitted[1],splitted[0]);
        // now you can access the Date and use its methods 
        document.getElementById('day').innerHTML = myDate.getDate();
        document.getElementById('month').innerHTML = myDate.getMonth();
        document.getElementById('year').innerHTML = myDate.getFullYear();
      }
    </script>
  </body>
</html>
Jonathana
quelle
0

Eine weitere Möglichkeit besteht darin, eine Regex mit benannten Erfassungsgruppen über der Formatzeichenfolge zu erstellen und diese Regex dann zu verwenden, um Tag, Monat und Jahr aus der Datumszeichenfolge zu extrahieren:

function parseDate(dateStr, format) {
  const regex = format.toLocaleLowerCase()
    .replace(/\bd+\b/, '(?<day>\\d+)')
    .replace(/\bm+\b/, '(?<month>\\d+)')
    .replace(/\by+\b/, '(?<year>\\d+)')
  
  const parts = new RegExp(regex).exec(dateStr) || {};
  const { year, month, day } = parts.groups || {};
  return parts.length === 4 ? new Date(year, month-1, day) : undefined;
}

const printDate = x => console.log(x ? x.toLocaleDateString() : x);

printDate(parseDate('05/11/1896', 'dd/mm/YYYY'));
printDate(parseDate('07-12-2000', 'dd-mm-yy'));
printDate(parseDate('07:12:2000', 'dd:mm:yy'));
printDate(parseDate('2017/6/3', 'yy/MM/dd'));
printDate(parseDate('2017-6-15', 'y-m-d'));
printDate(parseDate('2015 6 25', 'y m d'));
printDate(parseDate('2015625', 'y m d')); // bad format

jo_va
quelle
nette Lösung, aber Sie wissen vielleicht nicht, dass Firefox RegExp-benannte Gruppen immer noch nicht unterstützt - bugzilla.mozilla.org/show_bug.cgi?id=1362154 (PS: Ich bin es nicht, der Ihre Antwort
abgelehnt hat