Je suis coincé dans une situation étrange et malheureusement, même après avoir fait du RnD et googlé, je suis incapable de résoudre ce problème.
J'ai une chaîne de date au format ISO, comme 2014-11-03T19:38:34.203Z
et je veux la convertir en un objet de date avec la méthode new Date()
.
Mais quand je le fais, la sortie est:
var isoDate = '2014-11-03T19:38:34.203Z';
console.log(new Date(isoDate)); //output is: Tue Nov 04 2014 01:08:34 GMT+0530 (IST)
La date que j’ai passée est de 3 Nov,2014
et la sortie est 4 Nov,2014
et c’est à cause de GMT +5.30 de notre heure locale (IST).
Donc, existe-t-il une méthode générique avec laquelle je peux obtenir l'objet date
qui renvoie la date de Nov 3,2014
.
NOTE: Je n'ai aucun problème avec l'horodatage. Nous pouvons changer la chaîne temporelle à zéro avec la méthode setHours()
. La seule chose que je veux, c'est un objet date
comme new Date()
ayant la date de 3 Nov,2014
.
Ne passez pas de chaînes au constructeur Date, il est notoirement mauvais pour analyser les chaînes. IE 8, pour sa part, n'analysera pas du tout les chaînes de format ISO et retournera NaN. C'est très simple d'écrire votre propre analyseur:
function parseISOString(s) {
var b = s.split(/\D+/);
return new Date(Date.UTC(b[0], --b[1], b[2], b[3], b[4], b[5], b[6]));
}
Notez également que si l'heure est 19: 38: 34.203 UTC et que votre fuseau horaire est UTC +0530, l'heure de ce fuseau horaire est 01:08:34 le lendemain, d'où la différence de dates. Par exemple, pour une personne sur la côte est de l'Australie qui n'observe pas l'heure d'été (c.-à-d. UTC +10), cela équivaut à:
4 November, 2014 05:38:34
Ainsi, si vous souhaitez renvoyer la date à une date ISO, vous pouvez utiliser les méthodes getISO * pour créer le format de votre choix, par exemple.
function isoFormatDMY(d) {
function pad(n) {return (n<10? '0' : '') + n}
return pad(d.getUTCDate()) + '/' + pad(d.getUTCMonth() + 1) + '/' + d.getUTCFullYear();
}
var s = '2014-11-03T19:38:34.203Z';
var date = parseISOString(s);
console.log(isoFormatDMY(date)) // 03/11/2014
ou utilisez les ES toISOString :
parseISOString('2014-11-03T19:38:34.203Z').toISOString(); // 2014-11-03T19:38:34.203Z
Un polyfill simple pour les navigateurs pré ES5:
if (!Date.prototype.toISOString) {
Date.prototype.toISOString = function() {
var d = this;
// Padding functions
function pad(n) {return (n<10? '0' : '') + n}
function padd(n){return (n<100? '0' : '') + pad(n)}
return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) +
'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' +
pad(d.getUTCSeconds()) + '.' + padd(d.getMilliseconds()) + 'Z';
}
}
Vous pouvez utiliser "getUTCDate ()" pour obtenir la date réelle.
var d = new Date('2014-11-03T19:38:34.203Z');
var n = d.getUTCDate();
Mais il ne retournera que la date. pour obtenir le mois "getUTCMonth ()" et pour obtenir l'année "getUTCFullYear ()". Puis construisez tout à votre format. Par exemple
var n=[];
var d = new Date('2014-11-03T19:38:34.203Z');
var s = d.getUTCDate();
n.Push(s);
s=d.getUTCMonth();
n.Push(s);
s=d.getUTCFullYear();
n.Push(s);
enfin faire "n" comme objet.
Bonne chance
Cela dépend de ce que vous voulez faire avec l’objet plus tard. Vous pouvez toujours vous référer aux fonctions de date "UTC" de javascript.
Vérifiez la référence: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Je ne me souciais pas non plus de timestamp/timezone car je ne renvoie que les dates de SQL au format ISO. Pour éviter que le jour soit un jour d'avance ou un jour de retard lors de la conversion en objet Date, ceci fonctionne:
moment(ISOStringHere, 'YYYY-MM-DD HH:mm'); // leaving off Z makes it UTC to match database
Cela nécessite la bibliothèque Moment JS située ici:
Voici une fonction qui fonctionne bien pour ceux qui doivent prendre en charge des navigateurs plus anciens et ajuster correctement les fuseaux horaires dans les chaînes de date. J'ai utilisé la réponse de RobG comme point de départ, mais j'ai dû la modifier en profondeur car cela ne fonctionnait pas pour moi avec des chaînes qui présentaient des décalages pour le fuseau horaire du type "-07: 00" (c'est-à-dire des chaînes qui ne se terminent pas dans "Z").
// Parse an ISO date string (i.e. "2019-01-18T00:00:00.000Z",
// "2019-01-17T17:00:00.000-07:00", or "2019-01-18T07:00:00.000+07:00",
// which are the same time) and return a JavaScript Date object with the
// value represented by the string.
function isoStringToDate( isoString ) {
// Split the string into an array based on the digit groups.
var dateParts = isoString.split( /\D+/ );
// Set up a date object with the current time.
var returnDate = new Date();
// Manually parse the parts of the string and set each part for the
// date. Note: Using the UTC versions of these functions is necessary
// because we're manually adjusting for time zones stored in the
// string.
returnDate.setUTCFullYear( parseInt( dateParts[ 0 ] ) );
// The month numbers are one "off" from what normal humans would expect
// because January == 0.
returnDate.setUTCMonth( parseInt( dateParts[ 1 ] - 1 ) );
returnDate.setUTCDate( parseInt( dateParts[ 2 ] ) );
// Set the time parts of the date object.
returnDate.setUTCHours( parseInt( dateParts[ 3 ] ) );
returnDate.setUTCMinutes( parseInt( dateParts[ 4 ] ) );
returnDate.setUTCSeconds( parseInt( dateParts[ 5 ] ) );
returnDate.setUTCMilliseconds( parseInt( dateParts[ 6 ] ) );
// Track the number of hours we need to adjust the date by based
// on the timezone.
var timezoneOffsetHours = 0;
// If there's a value for either the hours or minutes offset.
if ( dateParts[ 7 ] || dateParts[ 8 ] ) {
// Track the number of minutes we need to adjust the date by
// based on the timezone.
var timezoneOffsetMinutes = 0;
// If there's a value for the minutes offset.
if ( dateParts[ 8 ] ) {
// Convert the minutes value into an hours value.
timezoneOffsetMinutes = parseInt( dateParts[ 8 ] ) / 60;
}
// Add the hours and minutes values to get the total offset in
// hours.
timezoneOffsetHours = parseInt( dateParts[ 7 ] ) + timezoneOffsetMinutes;
// If the sign for the timezone is a plus to indicate the
// timezone is ahead of UTC time.
if ( isoString.substr( -6, 1 ) == "+" ) {
// Make the offset negative since the hours will need to be
// subtracted from the date.
timezoneOffsetHours *= -1;
}
}
// Get the current hours for the date and add the offset to get the
// correct time adjusted for timezone.
returnDate.setHours( returnDate.getHours() + timezoneOffsetHours );
// Return the Date object calculated from the string.
return returnDate;
}
Utilisation/quelques tests:
// All three of these tests output the same date (relative to your
// timezone) as they should, which in my case is:
// "Thu Jan 17 2019 17:00:00 GMT-0700 (Mountain Standard Time)".
console.log( isoStringToDate( "2019-01-18T00:00:00.000Z" ) );
console.log( isoStringToDate( "2019-01-17T17:00:00.000-07:00" ) );
console.log( isoStringToDate( "2019-01-18T07:00:00.000+07:00" ) );
À des fins d’affichage, vous pouvez simplement le faire ........ Vous pouvez implémenter la "date" au format ISO,
<div> {{Date | date:"dd MMM yy hh:mm a" }} </div>
Une astuce astucieuse pour afficher (afficher uniquement) la date dans le format requis.
J'espère que ça aide!