web-dev-qa-db-fra.com

Changer la chaîne de date ISO en objet Date - JavaScript

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.

16
Mohit Pandey

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

Modifier

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';
  }
}
11
RobG

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

1
Lashus

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:

https://momentjs.com/

0
CaptainDingle

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" ) );
0
kevinmicke

À 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!

0
AnweshCR7