Come posso convertire una stringa in una data in JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
o String -> Date
?
Come posso convertire una stringa in una data in JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
o String -> Date
?
Risposte:
Il miglior formato di stringa per l'analisi delle stringhe è il formato ISO della data insieme al costruttore dell'oggetto JavaScript Date.
Esempi di formato ISO: YYYY-MM-DD
o YYYY-MM-DDTHH:MM:SS
.
Ma aspetta! L'uso del "formato ISO" non funziona in modo affidabile da solo. Le stringhe vengono talvolta analizzate come UTC e talvolta come localtime (in base al fornitore e alla versione del browser). La migliore pratica dovrebbe sempre essere quella di memorizzare le date come UTC e fare calcoli come UTC.
Per analizzare una data come UTC, aggiungere una Z - ad esempio: new Date('2011-04-11T10:20:30Z')
.
Per visualizzare una data in UTC, utilizzare .toUTCString()
,
per visualizzare una data nell'ora locale dell'utente, utilizzare .toString()
.
Maggiori informazioni su MDN | Data e questa risposta .
Per vecchio Internet Explorer compatibilità (versioni di IE inferiore a 9 non supportano il formato ISO in data costruttore), si dovrebbe dividere datetime rappresentazione di stringa di sue parti e quindi è possibile utilizzare il costruttore utilizzando datetime parti, come ad esempio: new Date('2011', '04' - 1, '11', '11', '51', '00')
. Si noti che il numero del mese deve essere 1 in meno.
Metodo alternativo: utilizzare una libreria appropriata:
Puoi anche sfruttare la libreria Moment.js che consente di analizzare la data con il fuso orario specificato.
new Date('2011-04-11T11:51:00')
la data di creazione è valida.
new Date('1970-30-02')
non è una data valida perché non ci sono 30 mesi in un anno. Non è possibile effettuare l'overflow di mesi ma quando si overflow giorni si risolve in Chrome e Firefox a una data valida: new Date('1970-02-30')
è quindi lo stesso giorno della nuova data ('1970-03-02').
Purtroppo l'ho scoperto
var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());
restituisce "Mer 02 aprile 2014". So che sembra folle, ma succede per alcuni utenti.
La soluzione antiproiettile è la seguente:
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
vengono analizzate come UTC e toString restituisce l' ora locale, quindi a seconda del fuso orario degli utenti può sicuramente restituire risultati diversi. Se vuoi sempre l'ora come UTC, allora dovresti usare toUTCString .
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
E l'output sarà:
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()
metodo in quanto non è compatibile con il browser senza polifili. Utilizzare invece i metodi JS più compatibili .match()
o .test()
vaniglia.
var _delimiter = _format.match(/\W/g)[0];
all'inizio della funzione è possibile ottenere il delimitatore automaticamente e prescindere dal 3o parametro.
moment.js ( http://momentjs.com/ ) è un pacchetto completo e valido per le date di utilizzo e supporta stringhe ISO 8601 .
È possibile aggiungere una data e un formato stringa.
moment("12-25-1995", "MM-DD-YYYY");
E puoi verificare se una data è valida.
moment("not a real date").isValid(); //Returns false
Alcuni esempi di visualizzazione
let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL'))
// output: "3 months ago | February 1, 2019"
Vedi documentazione http://momentjs.com/docs/#/parsing/string-format/
Raccomandazione: consiglio di usare un pacchetto per le date che contiene molti formati perché il fuso orario e la gestione del tempo del formato sono davvero un grosso problema, momento che js risolve molti formati. È possibile analizzare facilmente la data da una semplice stringa fino ad oggi, ma penso che sia un duro lavoro per supportare tutti i formati e le variazioni delle date.
Passalo come argomento a Date ():
var st = "date in some format"
var dt = new Date(st);
È possibile accedere al data, mese, anno utilizzando, ad esempio: dt.getMonth()
.
console.log(new Date('30-08-2018'))
e ricevo una data non valida
01/02/2020
sul mio computer (nel Regno Unito), tornerà il 1 ° febbraio dove, come se la stessa cosa fosse fatta negli Stati Uniti, tornerà il 2 gennaio. Praticamente non dovresti mai usare questa ingenua implementazione. Usa invece il momento .
Se puoi usare la fantastica libreria dei momenti (ad es. In un progetto Node.js) puoi facilmente analizzare la tua data usando ad es
var momentDate = moment("2014-09-15 09:00:00");
e può accedere all'oggetto data JS tramite
momentDate ().toDate();
new Date(2000, 10, 1)
ti darà "Mer 01 Nov 2000 00:00:00 GMT + 0100 (CET)"
Vedi che 0 per mese ti dà gennaio
Per coloro che cercano una soluzione piccola e intelligente:
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);
};
Esempio:
"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");
Appena new Date(st);
Supponendo che sia il formato corretto .
Se si desidera convertire dal formato "gg / MM / aaaa". Ecco un esempio:
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]);
Questa soluzione funziona con versioni IE inferiori a 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
valore? Come var date = new Date(undefined)
:?
Converti in formato pt-BR:
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]);
}
Spero di aiutare qualcuno !!!
Ho creato un violino per questo, è possibile utilizzare la funzione toDate () su qualsiasi stringa di date e fornire il formato della data. Questo ti restituirà un oggetto Date. https://jsfiddle.net/Sushil231088/q56yd0rp/
"17/9/2014".toDate("dd/MM/yyyy", "/")
Per convertire la stringa fino ad oggi in js che uso 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
Ancora un altro modo per farlo:
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
Puoi provare questo:
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);
o
var date = new Date('01/01/1970');
la stringa di data nel formato '01 -01-1970 'non funzionerà in FireFox, quindi meglio usare "/" invece di "-" nella stringa di formato della data.
Se devi controllare il contenuto della stringa prima di convertirlo in formato data:
// 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;
}
Ho creato la funzione parseDateTime per convertire la stringa in oggetto data e funziona in tutti i browser (incluso il browser IE), controlla se è necessario qualcuno, fai riferimento https://github.com/Umesh-Markande/Parse-String-to-Date -in-tutto-il 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)
Questa risposta si basa sulla risposta di Kassem ma gestisce anche anni a due cifre. Ho inviato una modifica alla risposta di Kassem, ma nel caso in cui non fosse stata approvata, la sto anche inviando come risposta separata.
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","-")
Puoi usare regex per analizzare la stringa per dettagliare l'ora, quindi creare la data o qualsiasi formato di ritorno come:
//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));
Oggi (2020/05/08) eseguo i test per le soluzioni scelte - per due casi: la data di ingresso è ISO8601 stringa (annuncio, Bd, Cd, Dd, ndr) e l'ingresso è data timestamp (A, Ct, Dt). Le soluzioni Bd, Cd, Ct non restituiscono js Date object come risultati, ma li aggiungo perché possono essere utili ma non li confronto con soluzioni valide. Questi risultati possono essere utili per un'analisi approfondita della data.
new Date
(annuncio) è 50-100 volte più veloce di moment.js (Dd) per tutti i browser per data e timestamp ISOnew Date
(annuncio) è ~ 10 volte più veloce diparseDate
(Ed)Date.parse
(Bd) è più veloce se è necessario ottenere il timestamp dalla data ISO su tutti i browserEseguo test su MacO High Sierra 10.13.6 su Chrome 81.0, Safari 13.1, Firefox 75.0. La soluzione parseDate
(Ed) utilizza new Date(0)
e imposta manualmente i componenti della data UTC.
Risultati per Chrome
I datestring secondo ISO 8601, eccellenti quanto lo standard, non sono ancora ampiamente supportati.
Questa è un'ottima risorsa per capire quale formato di datestring dovresti usare:
http://dygraphs.com/date-formats.html
Sì, ciò significa che il tuo datestring potrebbe essere tanto semplice quanto contrario
"2014/10/13 23:57:52"
invece di
"2014-10-13 23:57:52"
usa questo codice: (il mio problema è stato risolto con questo codice)
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;
}
Ho scritto una funzione riutilizzabile che utilizzo quando ricevo stringhe di date dal server.
puoi passare il delimitatore desiderato (/ - ecc.) che separa il giorno e l'anno del mese per utilizzare il split()
metodo.
puoi vederlo e provarlo su questo esempio funzionante .
<!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>
Un altro modo per farlo è costruire una regex con gruppi di acquisizione con nome sulla stringa di formato e quindi utilizzare quella regex per estrarre il giorno, il mese e l'anno dalla stringa di data:
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