web-dev-qa-db-fra.com

javascript toISOString () ignore le décalage du fuseau horaire

J'essaie de convertir la date/heure Twitter en une chaîne iso locale (pour prettyDate) maintenant pendant 2 jours. Je ne fais pas juste l'heure locale exacte ..

im en utilisant la fonction suivante:

function getLocalISOTime(twDate) {
    var d = new Date(twDate);
    var utcd = Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(),
        d.getMinutes(), d.getSeconds(), d.getMilliseconds());

    // obtain local UTC offset and convert to msec
    localOffset = d.getTimezoneOffset() * 60000;
    var newdate = new Date(utcd + localOffset);
    return newdate.toISOString().replace(".000", "");
}

dans newdate, tout est ok, mais toISOString () le ramène à l'heure d'origine ... Quelqu'un peut-il m'aider à obtenir l'heure locale en iso à partir de Twitterdate au format: jeu., 31 mai 2012 08:33:41 +0000

110
Cyril Mestrom

moment.js Est génial, mais parfois vous ne voulez pas extraire un grand nombre de dépendances pour des choses simples.

Ce qui suit fonctionne aussi bien:

var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1);
// => '2015-01-26T06:40:36.181'

La slice(0, -1) supprime le Z final, qui représente le fuseau horaire zoulou et peut être remplacé par le vôtre.

207
user1936097

Ma solution sans utiliser moment consiste à le convertir en horodatage, à ajouter le décalage de fuseau horaire, puis à le reconvertir en un objet de date, puis à exécuter la commande toISOString ().

var date = new Date(); // Or the date you'd like converted.
isoDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
66
Dustin Silk

moment.js FTW !!!

Convertissez simplement votre date en un moment et manipulez-la comme bon vous semble:

var d = new Date(twDate);
var m = moment(d).format();
console.log(m);
// example output:
// 2016-01-08T00:00:00-06:00

http://momentjs.com/docs/

9
boxes

Cette fonction de date ci-dessous permet d'obtenir l'effet souhaité sans une bibliothèque de scripts supplémentaire. En gros, il ne s'agit que d'une simple concaténation de composant de date dans le bon format et d'une augmentation du prototype de l'objet Date.

 Date.prototype.dateToISO8601String  = function() {
    var padDigits = function padDigits(number, digits) {
        return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number;
    }
    var offsetMinutes = this.getTimezoneOffset();
    var offsetHours = offsetMinutes / 60;
    var offset= "Z";    
    if (offsetHours < 0)
      offset = "-" + padDigits(offsetHours.replace("-","") + "00",4);
    else if (offsetHours > 0) 
      offset = "+" + padDigits(offsetHours  + "00", 4);

    return this.getFullYear() 
            + "-" + padDigits((this.getUTCMonth()+1),2) 
            + "-" + padDigits(this.getUTCDate(),2) 
            + "T" 
            + padDigits(this.getUTCHours(),2)
            + ":" + padDigits(this.getUTCMinutes(),2)
            + ":" + padDigits(this.getUTCSeconds(),2)
            + "." + padDigits(this.getUTCMilliseconds(),2)
            + offset;

}

Date.dateFromISO8601 = function(isoDateString) {
      var parts = isoDateString.match(/\d+/g);
      var isoTime = Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
      var isoDate = new Date(isoTime);
      return isoDate;       
}

function test() {
    var dIn = new Date();
    var isoDateString = dIn.dateToISO8601String();
    var dOut = Date.dateFromISO8601(isoDateString);
    var dInStr = dIn.toUTCString();
    var dOutStr = dOut.toUTCString();
    console.log("Dates are equal: " + (dInStr == dOutStr));
}

Usage:

var d = new Date();
console.log(d.dateToISO8601String());

Espérons que cela aide quelqu'un d'autre.

MODIFIER

Problème UTC corrigé mentionné dans les commentaires et crédit à Alex pour le dateFromISO8601 une fonction.

7
James

Moment js solution à cela est

var d = new Date(new Date().setHours(0,0,0,0));
m.add(m.utcOffset(), 'm')
m.toDate().toISOString()
// output "2019-07-18T00:00:00.000Z"
0
Ravi Kumar Mistry

Vous pouvez utiliser le paramètre keepOffset de toISOString:

toISOString(keepOffset?: boolean): string;

=>

moment (). toISOString (true)

0
Omer Gurarslan

Il sera très utile d’obtenir la date et l’heure actuelles.

var date=new Date();
  var today=new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().replace(/T/, ' ').replace(/\..+/, '');  
0
Nagnath Mungade