Comment puis-je convertir une chaîne à une date en JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Le meilleur format de chaîne pour l'analyse de chaîne est le format ISO de date associé au constructeur d'objet JavaScript Date.
Exemples de format ISO: YYYY-MM-DD
ou YYYY-MM-DDTHH:MM:SS
.
Mais attendez! L'utilisation du "format ISO" ne fonctionne pas de manière fiable. Les chaînes sont parfois analysées au format UTC et parfois au format local (en fonction du fournisseur et de la version du navigateur). La meilleure pratique devrait toujours être de stocker les dates au format UTC et d’effectuer les calculs au format UTC.
Pour analyser une date au format 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 à l'heure locale de l'utilisateur, utilisez .toString()
.
Plus d'infos sur MDN | Date et cette réponse .
Pour une compatibilité ancienne avec Internet Explorer (les versions IE inférieures à 9 ne prennent pas en charge le format ISO dans le constructeur Date), vous devez scinder la représentation de chaîne datetime en plusieurs parties, puis utiliser un constructeur utilisant des pièces datetime, par exemple: new Date('2011', '04' - 1, '11', '11', '51', '00')
. Notez que le nombre du mois doit être 1 moins.
Méthode alternative - utilisez une bibliothèque appropriée:
Vous pouvez également tirer parti de la bibliothèque Moment.js qui permet d’analyser la date avec le fuseau horaire spécifié.
Malheureusement, j'ai découvert que
var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());
renvoie "mer 02 avr 2014". Je sais que cela semble fou, mais cela arrive pour certains utilisateurs.
La solution bulletproof 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());
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
Et le résultat 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","-")
Passez le comme argument à Date ():
var st = "date in some format"
var dt = new Date(st);
Vous pouvez accéder à la date, au mois, à l’année en utilisant, par exemple: dt.getMonth()
.
moment.js ( http://momentjs.com/ ) est un package complet et performant pour les dates et supports d’utilisation 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
Voir la documentation http://momentjs.com/docs/#/parsing/string-format/
Recommandation: Je recommande d'utiliser un paquet pour les dates qui contient beaucoup de formats, car la gestion du fuseau horaire et du format est vraiment un gros problème, js résolve beaucoup de formats. Vous pouvez facilement analyser une date depuis une simple chaîne à la fois, mais j'estime qu'il est difficile de prendre en charge tous les formats et variations de dates.
new Date(2000, 10, 1)
vous donnera "mercredi 01 novembre 2000 00:00:00 GMT + 0100 (CET)"
Voir que 0 pour le mois vous donne Janvier
Si vous pouvez utiliser la formidable bibliothèque moment (par exemple dans un projet Node.js), vous pouvez facilement analyser votre date à l'aide.
var momentDate = moment("2014-09-15 09:00:00");
et peut accéder à l'objet de date JS via
momentDate ().toDate();
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
Pour ceux qui recherchent une solution petite 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");
Si vous voulez convertir 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.
Date.parse
vous donne presque ce que vous voulez. Cela étouffe la partie am
/pm
, mais avec quelques piratages, 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;
}
check out datejs library http://www.datejs.com/
Juste new Date(st);
En supposant que c'est le bon format.
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 retournera un objet Date . https://jsfiddle.net/Sushil231088/q56yd0rp/
"17/9/2014".toDate("dd/MM/yyyy", "/")
Pour convertir une chaîne en date 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
J'ai créé cette fonction pour convertir n'importe quel objet Date en objet Date UTC.
function dateToUTC(date) {
return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}
dateToUTC(new Date());
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
Si vous devez vérifier le contenu de la chaîne avant la conversion 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;
}
var a = "13:15"
var b = toDate(a, "h:m")
alert(b);
function toDate(dStr, format) {
var now = new Date();
if (format == "h:m") {
now.setHours(dStr.substr(0, dStr.indexOf(":")));
now.setMinutes(dStr.substr(dStr.indexOf(":") + 1));
now.setSeconds(0);
return now;
} else
return "Invalid Format";
}
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 est donc préférable d'utiliser "/" au lieu de "-" dans la chaîne de format de date.
J'ai écrit une fonction réutilisable que j'utilise lorsque je reçois des chaînes de date du serveur.
vous pouvez transmettre le délimiteur souhaité (/ - etc ..) qui sépare le jour, le mois et l’année afin d’utiliser la méthode split()
.
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>
Vous pouvez utiliser regex pour analyser une chaîne afin de détailler l'heure, puis créer une date ou tout 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));
Une autre méthode 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
utiliser 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;
}
//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);
Les bases de données ISO 8601, aussi excellentes soient-elles, ne sont toujours pas largement prises en charge.
C'est une excellente ressource pour déterminer le format de chaîne de données à utiliser:
http://dygraphs.com/date-formats.html
Oui, cela signifie que votre chaîne de données pourrait être aussi simple que par opposition à
"2014/10/13 23:57:52"
au lieu de "2014-10-13 23:57:52"