Comment puis-je convertir une chaîne en une date en JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
ou String -> Date
?
Comment puis-je convertir une chaîne en une date en JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
ou String -> Date
?
Réponses:
Le meilleur format de chaîne pour l'analyse de chaîne est le format ISO de date avec le constructeur d'objet JavaScript Date.
Exemples de format ISO: YYYY-MM-DD
ou YYYY-MM-DDTHH:MM:SS
.
Mais attendez! Le simple fait d'utiliser le "format ISO" ne fonctionne pas de manière fiable en soi. Les chaînes sont parfois analysées en UTC et parfois en heure locale (en fonction du fournisseur et de la version du navigateur). La meilleure pratique devrait toujours être de stocker les dates en UTC et de faire des calculs en UTC.
Pour analyser une date en UTC, ajoutez un Z - par exemple:new Date('2011-04-11T10:20:30Z')
.
Pour afficher une date en UTC, utilisez .toUTCString()
,
pour afficher une date dans l'heure locale de l'utilisateur, utilisez.toString()
.
Plus d'informations sur MDN | Date et cette réponse .
Pour la compatibilité ancienne Internet Explorer (IE versions moins de 9 ne prennent pas en charge le format ISO dans le constructeur Date), vous devez diviser datetime représentation de chaîne à des parties de et ensuite vous pouvez utiliser constructeur en utilisant datetime pièces, par exemple: new Date('2011', '04' - 1, '11', '11', '51', '00')
. Notez que le numéro du mois doit être inférieur de 1.
Autre méthode - utilisez une bibliothèque appropriée:
Vous pouvez également profiter de la bibliothèque Moment.js qui permet d'analyser la date avec le fuseau horaire spécifié.
new Date('2011-04-11T11:51:00')
la date de création est valide.
new Date('1970-30-02')
c'est une date invalide car il n'y a pas 30 mois dans une année. Vous ne pouvez pas déborder de mois, mais lorsque vous débordez de jours, il se résout dans Chrome et Firefox à une date valide: new Date('1970-02-30')
est alors le même jour que la nouvelle date ('1970-03-02').
Malheureusement, j'ai découvert que
var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());
renvoie "Wed Apr 02 2014". Je sais que cela semble fou, mais cela arrive pour certains utilisateurs.
La solution pare-balles est la suivante:
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
sont analysées en UTC et toString renvoie l' heure locale , donc en fonction du fuseau horaire des utilisateurs, il peut très certainement retourner des résultats différents. Si vous voulez toujours l'heure en UTC, vous devez utiliser toUTCString .
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
Et la sortie sera:
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()
méthode car elle n'est pas compatible avec plusieurs navigateurs sans fichiers polyfils. À la place, utilisez les méthodes JS plus compatibles .match()
ou .test()
vanilla.
var _delimiter = _format.match(/\W/g)[0];
au début de la fonction, vous pouvez obtenir le délimiteur automatiquement et pré-découper le 3ème paramètre.
moment.js ( http://momentjs.com/ ) est un package complet et efficace pour les dates d'utilisation et prend en charge les chaînes ISO 8601 .
Vous pouvez ajouter une date et un format de chaîne.
moment("12-25-1995", "MM-DD-YYYY");
Et vous pouvez vérifier si une date est valide.
moment("not a real date").isValid(); //Returns false
Quelques exemples d'affichage
let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL'))
// output: "3 months ago | February 1, 2019"
Voir la documentation http://momentjs.com/docs/#/parsing/string-format/
Recommandation: je recommande d'utiliser un package pour les dates qui contient beaucoup de formats car le fuseau horaire et la gestion du temps de format sont vraiment un gros problème, moment js résout beaucoup de formats. Vous pouvez facilement analyser la date à partir d'une simple chaîne à ce jour, mais je pense que c'est un travail difficile pour prendre en charge tous les formats et variations de dates.
let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL'))
sorties: "il y a 3 mois | 1er février 2019"
Passez-le comme argument à Date ():
var st = "date in some format"
var dt = new Date(st);
Vous pouvez accéder à la date, le mois, l' année en utilisant, par exemple: dt.getMonth()
.
console.log(new Date('30-08-2018'))
et reçois une date invalide
01/02/2020
sur mon ordinateur (au Royaume-Uni), il retournera le 1er février où, comme si la même chose se faisait aux États-Unis, il retournera le 2 janvier. Vous ne devriez pratiquement jamais utiliser cette implémentation naïve. Utilisez plutôt le moment .
Si vous pouvez utiliser la bibliothèque de moments formidables (par exemple dans un projet Node.js), vous pouvez facilement analyser votre date en utilisant par exemple
var momentDate = moment("2014-09-15 09:00:00");
et peut accéder à l'objet de date JS via
momentDate ().toDate();
new Date(2000, 10, 1)
vous donnera "Mer 01 nov 2000 00:00:00 GMT + 0100 (CET)"
Voir que 0 pour le mois vous donne janvier
Pour ceux qui recherchent une solution minuscule et 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);
};
Exemple:
"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");
Juste new Date(st);
En supposant que c'est le bon format .
Si vous souhaitez convertir à partir du format "jj / MM / aaaa". Voici un exemple:
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]);
Cette solution fonctionne dans les versions IE inférieures à 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
valeur? Comme var date = new Date(undefined)
:?
Date.parse
vous obtient presque ce que vous voulez. Il s'étouffe sur la partie am
/ pm
, mais avec un certain piratage, vous pouvez le faire fonctionner:
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;
}
Convertir au format 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]);
}
J'espère aider quelqu'un !!!
J'ai créé un violon pour cela, vous pouvez utiliser la fonction toDate () sur n'importe quelle chaîne de date et fournir le format de date. Cela vous renverra un objet Date. https://jsfiddle.net/Sushil231088/q56yd0rp/
"17/9/2014".toDate("dd/MM/yyyy", "/")
Pour convertir une chaîne à ce jour en js, j'utilise 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
Encore une autre façon de le faire:
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
Vous pouvez essayer ceci:
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);
ou
var date = new Date('01/01/1970');
la chaîne de date au format '01 -01-1970 'ne fonctionnera pas dans FireFox, il vaut donc mieux utiliser "/" au lieu de "-" dans la chaîne de format de date.
Si vous devez vérifier le contenu de la chaîne avant de convertir au format Date:
// 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;
}
J'ai créé la fonction parseDateTime pour convertir la chaîne en objet date et cela fonctionne dans tous les navigateurs (y compris le navigateur IE), vérifiez si quelqu'un est nécessaire, référence https://github.com/Umesh-Markande/Parse-String-to-Date -en-tout-navigateur
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)
Cette réponse est basée sur la réponse de Kassem mais elle traite également les années à deux chiffres. J'ai soumis une modification à la réponse de Kassem, mais au cas où elle ne serait pas approuvée, je la soumets également en tant que réponse distincte.
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","-")
Vous pouvez utiliser regex pour analyser la chaîne pour détailler l'heure, puis créer une date ou tout autre format de retour comme:
//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));
Aujourd'hui (2020.05.08), j'effectue des tests pour les solutions choisies - pour deux cas: la date d'entrée est une chaîne ISO8601 (Ad, Bd, Cd, Dd, Ed) et la date d'entrée est un horodatage (At, Ct, Dt). Les solutions Bd, Cd, Ct ne renvoient pas d'objet js Date comme résultats, mais je les ajoute car elles peuvent être utiles mais je ne les compare pas avec des solutions valides. Ces résultats peuvent être utiles pour une analyse de date massive.
new Date
(Ad) est 50 à 100 fois plus rapide que moment.js (Dd) pour tous les navigateurs pour la date et l'horodatage ISOnew Date
(Ad) est environ 10 fois plus rapide queparseDate
(Ed)Date.parse
(Bd) est la plus rapide si nous devons obtenir l'horodatage de la date ISO sur tous les navigateursJ'effectue un test sur MacOs High Sierra 10.13.6 sur Chrome 81.0, Safari 13.1, Firefox 75.0. La solution parseDate
(Ed) utilise new Date(0)
et définit manuellement les composants de date UTC.
Résultats pour chrome
Les chaînes de données ISO 8601, aussi excellentes que la norme, ne sont toujours pas largement prises en charge.
Ceci est une excellente ressource pour déterminer le format de chaîne de données que vous devez utiliser:
http://dygraphs.com/date-formats.html
Oui, cela signifie que votre chaîne de données peut être aussi simple que par opposition à
"2014/10/13 23:57:52"
au lieu de
"2014-10-13 23:57:52"
utilisez ce code: (mon problème a été résolu avec ce code)
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;
}
J'ai écrit une fonction réutilisable que j'utilise lorsque j'obtiens des chaînes de date du serveur.
vous pouvez passer le délimiteur souhaité (/ - etc.) qui sépare le jour mois et année afin d'utiliser la split()
méthode.
vous pouvez le voir et le tester sur cet exemple de travail .
<!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>
Une autre façon de le faire consiste à créer une expression régulière avec des groupes de capture nommés sur la chaîne de format, puis à utiliser cette expression régulière pour extraire le jour, le mois et l'année de la chaîne de date:
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