javascript Data di rilascio del fuso orario

Ho bisogno di un object Date js con valori specificati per data e anno. Mi aspetterei una new Date("2000-01-01") per assegnarmi l’object Date con 2000 come valore per getFullYear() , ma se le impostazioni dell’ora del mio computer sono impostate sul fuso orario di Chicago, ricevo Fri Dec 31 1999 18:00:00 GMT-0600 (CST) , e per Buenos Aires: Fri Dec 31 1999 22:00:00 GMT-0200 (ARST) .

C’è un modo per creare l’object Date, con .getFullYear() restituendo la data che impostiamo nel costruttore, non importa quale fuso orario è impostato sul computer dell’utente?

Aggiornamento: ho bisogno che questo object Date sia usato in un’altra libreria (che chiama il suo metodo .getFullYear() , quindi l’utilizzo dei getter UTC non aiuta molto.

Quando si analizza una stringa in una Date in JavaScript, un valore nel formato YYYY-MM-DD viene interpretato come un valore UTC , anziché un valore di ora locale.

La chiave è che le parti sono separate da trattini e che non ci sono informazioni sul fuso orario nella stringa. La specifica ECMAScript 5.1 dice in §15.9.1.15 :

… Il valore di un offset del fuso orario assente è “Z”.

Ciò significa che se non si specifica un offset, si presumerà che si intenda UTC.

Si noti che poiché questo è l’opposto di ciò che dice ISO-8601, questo comportamento è stato modificato in ECMAScript 2015 (6.0), che dice in §20.3.1.16 :

… Se l’offset del fuso orario è assente, la data-ora viene interpretata come ora locale.

Pertanto, quando questa disposizione di ES6 viene implementata correttamente, i valori di stringa di questo formato che sono stati interpretati come UTC verranno interpretati come ora locale. Ho parlato di questo qui .

La soluzione è semplice. Sostituisci i trattini con le barre:

 var s = "2000-01-01"; var dt = new Date(s.replace(/-/g, '/')); 

Un’altra soluzione accettabile è assegnare un orario di mezzogiorno anziché mezzanotte alla data. Questo verrà analizzato come ora locale ed è abbastanza lontano da evitare qualsiasi conflitto di ora legale.

 var s = "2000-01-01"; var dt = new Date(s + "T12:00:00"); 

In alternativa, considera una libreria come moment.js che è molto più sensata.

 var s = "2000-01-01"; var dt = moment(s, 'YYYY-MM-DD').toDate(); 

Puoi scrivere un nuovo metodo su ‘Date.prototype’ e usarlo per ottenere la data che includerà l’offset del fuso orario locale.

  //return the date with depend of Local Time Zone Date.prototype.getUTCLocalDate = function () { var target = new Date(this.valueOf()); var offset = target.getTimezoneOffset(); var Y = target.getUTCFullYear(); var M = target.getUTCMonth(); var D = target.getUTCDate(); var h = target.getUTCHours(); var m = target.getUTCMinutes(); var s = target.getUTCSeconds(); return new Date(Date.UTC(Y, M, D, h, m + offset, s)); };