No meu aplicativo Java Script, tenho a data armazenada em um formato assim:
2011-09-24
Agora, quando tento usar o valor acima para criar um novo objeto Date (para recuperar a data em um formato diferente), a data sempre volta um dia de folga. Ver abaixo:
var doo = new Date("2011-09-24");
console.log(doo);
Histórico:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
javascript
date
levi
fonte
fonte
Respostas:
Observe que o horário de verão oriental é
-4 hours
e que as horas na data em que você está voltando são20
.que é meia-noite de 24/09/2011. A data foi analisada no UTC (GMT) porque você forneceu uma sequência apenas de data sem nenhum indicador de fuso horário. Se você forneceu uma string de data / hora sem um indicador (
new Date("2011-09-24T00:00:00")
), ela teria sido analisada no fuso horário local. (Historicamente, houve inconsistências por lá, principalmente porque as especificações foram alteradas mais de uma vez, mas os navegadores modernos devem estar bem; ou você sempre pode incluir um indicador de fuso horário.)Você está obtendo a data certa, apenas nunca especificou o fuso horário correto.
Se você precisar acessar os valores da data, poderá usar
getUTCDate()
ou qualquer uma das outrasgetUTC*()
funções :fonte
EDT
é o horário de verão (também conhecido como horário de verão) ,EST
é o fuso horário que se aplica a janeiro.new Date('2012-01-01 GMT')
isso, ainda aplicará um deslocamento, pois o converterá na hora local da data do usuário.get*
métodos e precisar que ele retorne a data / hora correta, incluindo o deslocamento de fuso horário desconhecido, basta adicionar o deslocamento de fuso horário desconhecido:d = new Date('2013-01-08 GMT'); d.setMinutes(d.getMinutes() + d.getTimezoneOffset());
Isso normalizará a data para a localidade do usuário, para que os.get*
métodos retornem o valor esperado. Os.getUTC*
métodos estarão incorretos, portanto, tenha cuidado.Existem várias coisas malucas que acontecem com um objeto JS DATE que convertem seqüências de caracteres, por exemplo, considere a data seguinte que você forneceu
Se você fornecer argumentos separados para o construtor Date, poderá obter outras saídas úteis, conforme descrito abaixo
Nota: os argumentos podem ser do tipo Número ou String. Vou mostrar exemplos com valores mistos.
fonte
Para normalizar a data e eliminar o deslocamento indesejado (testado aqui: https://jsfiddle.net/7xp1xL5m/ ):
Isso também realiza o mesmo e crédito para @tpartee (testado aqui: https://jsfiddle.net/7xp1xL5m/1/ ):
fonte
doo.setMinutes(doo.getMinutes() + doo.getTimezoneOffset())
Se você deseja obter a hora 0 de alguma data no fuso horário local, passe as partes individuais da data para o
Date
construtor.fonte
Só quero acrescentar que, aparentemente, adicionar um espaço no final da string usará o UTC para criação.
Edit: Esta não é uma solução recomendada, apenas uma resposta alternativa. Por favor, não use essa abordagem, pois não está claro o que está acontecendo. Existem várias maneiras pelas quais alguém poderia refatorar isso acidentalmente, causando um erro.
fonte
Eu acredito que isso tem a ver com o ajuste de fuso horário. A data que você criou é GMT e o horário padrão é meia-noite, mas seu fuso horário é EDT, portanto, subtrai 4 horas. Tente isto para verificar:
fonte
Seu problema está especificamente no fuso horário. Observe a parte
GMT-0400
- você está 4 horas atrás do GMT. Se você adicionar 4 horas à data / hora exibida, receberá exatamente meia-noite 24/09/2011. Use otoUTCString()
método para obter a sequência GMT:fonte
Provavelmente, essa não é uma boa resposta, mas quero compartilhar minha experiência com esse problema.
Meu aplicativo usa globalmente utc date com o formato 'AAAA-MM-DD', enquanto o plug-in datepicker que eu uso somente aceita data js, é difícil para mim considerar utc e js. Então, quando eu quero passar uma data no formato 'AAAA-MM-DD' para o meu datepicker, primeiro a converto no formato 'MM / DD / AAAA' usando moment.js ou o que você quiser, e a data é exibida no datepicker agora corrigir. Para o seu exemplo
Aparentemente, d1 é o que eu quero. Espero que isso seja útil para algumas pessoas.
fonte
Isto através de mim para um loop, +1 na resposta do zzzBov. Aqui está uma conversão completa de uma data que funcionou para mim usando os métodos UTC:
fonte
Isso significa que
2011-09-24 00:00:00 GMT
, e como você estáGMT -4
, será20:00
no dia anterior.Pessoalmente, entendo
2011-09-24 02:00:00
, porque estou morandoGMT +2
.fonte
Embora, no caso do OP, o fuso horário seja EDT, não há garantia de que o usuário que está executando seu script seja no fuso horário EDT, portanto, a codificação codificada do deslocamento não funcionará necessariamente. A solução que encontrei divide a string de data e usa os valores separados no construtor Date.
Observe que você deve dar conta de outra parte da estranheza do JS: o mês é baseado em zero.
fonte
Encontrei esse problema exato em que meu cliente estava no horário padrão do Atlântico. O valor da data que o cliente recuperou foi "23/11/2018" e quando o código passou para
new Date("2018-11-23")
a saída do cliente foi para o dia anterior. Criei uma função de utilitário, como mostrado no trecho que normalizou a data, fornecendo ao cliente a data esperada.date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
fonte
se você apenas deseja garantir que as partes individuais da data permaneçam as mesmas para fins de exibição, * isso parece funcionar, mesmo quando eu mudo o fuso horário:
basta adicionar os zeros lá.
No meu código eu faço isso:
E alterno meu fuso horário no meu computador e a data permanece a mesma que a sequência de datas aaaa-mm-dd que recebo da API.
Mas estou faltando alguma coisa / isso é uma má idéia?
* pelo menos em cromo. Isso não funciona no Safari! no momento da redação deste
fonte
.toISOString()
, ele volta 1 dia atrás.new Date('2019/11/18 05:30:00').toISOString();
trabalhou para mimA melhor maneira de lidar com isso sem usar mais métodos de conversão,
Agora basta adicionar GMT à sua data ou você pode anexá-la.
Ao vivo: https://jsfiddle.net/gajender/2kop9vrk/1/
fonte
Eu enfrentei um problema como este. Mas o meu problema foi deslocado ao obter a data do banco de dados.
isso está espalhado no banco de dados e está no formato UTC.
Então, quando eu chegar do banco de dados e verificar a data, ele está adicionando deslocamento com ele e enviar de volta para javascript.
Ele está adicionando +05: 00 porque este é o fuso horário do meu servidor. Meu cliente está em um fuso horário diferente +07: 00.
Então, aqui está a minha solução, o que faço com esse problema.
Então, quando a data vier do servidor e tiver o deslocamento do servidor, divido a data e removo o deslocamento do servidor e depois os converto para a data. Isso resolve meu problema.
fonte
se você precisar de uma solução simples para isso, consulte:
fonte
Você está usando o formato de sequência de datas ISO que, de acordo com esta página , faz com que a data seja construída usando o fuso horário UTC:
Se você formatar o texto de maneira diferente, como
"Jan 01 1970"
(pelo menos na minha máquina), ele usará o fuso horário local.fonte
Tentando adicionar meus 2 centavos a este tópico (elaborando a resposta em @ paul-wintz).
Parece-me que, quando o construtor Date recebe uma string que corresponde à primeira parte do formato ISO 8601 (parte da data), ele faz uma conversão precisa da data no fuso horário UTC com 0 hora. Quando essa data é convertida para a hora local, pode ocorrer uma mudança de data se a meia-noite UTC for uma data anterior no fuso horário local.
Se a sequência de datas estiver em qualquer outro formato "mais flexível" (usa "/" ou a data / mês não for preenchida com zero), ela criará a data no fuso horário local, portanto, nenhum problema de alteração de data.
Portanto, uma solução rápida, como mencionado acima, é substituir "-" por "/" na sua string Data somente no formato ISO.
fonte
Armazenando
yyyy-mm-dd
no formato MySql Date, você deve fazer o seguinte:fonte
Seu log gera GMT e você deseja especificar seu fuso horário:
fonte
deixa pra lá, não percebeu o GMT -0400, o que faz com que a data seja ontem
Você pode tentar definir um "horário" padrão como 12:00:00
fonte
O seguinte funcionou para mim -
fonte