javascript Data timezone issue

Eu preciso de um object Date js com valores especificados para data e ano. Eu esperaria new Date("2000-01-01") para me dar o object Date com 2000 como valor para getFullYear() , mas se as configurações de tempo do meu computador estão definidas para fuso horário de Chicago, estou recebendo Fri Dec 31 1999 18:00:00 GMT-0600 (CST) , e para Buenos Aires: Fri Dec 31 1999 22:00:00 GMT-0200 (ARST) .

Existe uma maneira de criar object Date, com .getFullYear() retornando a data que definimos no construtor, não importando o fuso horário definido na máquina do usuário?

Update: Eu preciso deste object Date para ser usado em outra biblioteca (que chama seu método .getFullYear() , portanto, usar getters UTC realmente não ajuda.

Ao analisar uma string para uma Date em JavaScript, um valor que esteja no YYYY-MM-DD é interpretado como um valor UTC , em vez de um valor de hora local.

A chave é que as partes são separadas por hifens e que não há informações de fuso horário na string. A especificação ECMAScript 5.1 diz em §15.9.1.15 :

… O valor de um deslocamento de fuso horário ausente é “Z”.

Isso significa que, se você não especificar um deslocamento, ele assumirá que você quis dizer UTC.

Observe que, como isso é o oposto do que a ISO-8601 diz, esse comportamento foi alterado no ECMAScript 2015 (6.0), que diz no §20.3.1.16 :

… Se o deslocamento de fuso horário estiver ausente, a data e hora serão interpretadas como hora local.

Portanto, quando esta disposição do ES6 é implementada corretamente, os valores de string desse formato que costumavam ser interpretados como UTC serão interpretados como hora local. Eu escrevi sobre isso aqui .

A solução alternativa é simples. Substitua os hífens por barras:

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

Outra solução aceitável é atribuir uma hora do meio-dia em vez da meia-noite à data. Isso será analisado como hora local e estará longe o suficiente para evitar conflitos de horário de verão.

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

Alternativamente, considere uma biblioteca como moment.js, que é muito mais sensata.

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

Você pode escrever um novo método para ‘Date.prototype’ e usá-lo para obter a data que includeá o deslocamento do fuso horário local.

  //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)); };