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
Date -> String
oder String -> Date
?
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
Date -> String
oder String -> Date
?
Antworten:
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-DD
oder 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.
new Date('2011-04-11T11:51:00')
das Erstellungsdatum gültig.
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').
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());
yyyy-MM-dd
werden 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 .
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}
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","-")
.indexOf()
Methode nicht, da sie ohne Polydateien nicht browserübergreifend kompatibel ist. Verwenden Sie stattdessen die kompatibleren .match()
oder .test()
Vanilla JS-Methoden.
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.
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.
let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL'))
Ausgaben: "vor 3 Monaten | 1. Februar 2019"
Ü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()
.
console.log(new Date('30-08-2018'))
und bekomme ungültiges Datum
01/02/2020
auf 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 .
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();
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
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");
Gerade new Date(st);
Vorausgesetzt, es ist das richtige Format .
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.
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
undefined
Wert? Wie : var date = new Date(undefined)
?
Date.parse
bringt dir fast was du willst. Es verschluckt sich am am
/ pm
Teil, 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;
}
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 !!!
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", "/")
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
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());
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
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'));
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.
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;
}
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)
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","-")
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));
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.
new Date
(Ad) ist 50-100x schneller als moment.js (Dd) für alle Browser für ISO-Datum und Zeitstempelnew Date
(Anzeige) ist ~ 10x schneller als parseDate
(Ed)Date.parse
(Bd) ist am schnellsten, wenn in allen Browsern ein Zeitstempel vom ISO-Datum abgerufen werden mussIch 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
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"
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;
}}
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>
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