Quero analisar a data sem fuso horário em JavaScript. Eu tentei:
new Date(Date.parse("2005-07-08T00:00:00+0000"));
Volta a Sex Jul 08 2005 02:00:00 GMT + 0200 (Horário de verão da Europa Central)
new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));
Retorna o mesmo resultado
new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));
Retorna o mesmo resultado
Eu quero analisar o tempo:
Sem fuso horário.
Sem chamar o construtor Date.UTC ou nova Data (ano, mês, dia).
Apenas uma passagem simples para o construtor Date (sem abordagens de protótipo).
Eu tenho que
Date
objeto do produto , nãoString
.
Date.parse
btw e passar diretamente a string para oDate
construtor.Date
objeto para obter o objeto correto para comparar as datas no MongoDB:new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
Respostas:
A data é analisada corretamente, é apenas paraString que a converte no fuso horário local:
O objeto Data Javascript são carimbos de data e hora - apenas contêm um número de milissegundos desde a época. Não há informações de fuso horário em um objeto Data. A data do calendário (dia, minutos, segundos) que esse carimbo de data / hora representa é uma questão de interpretação (um dos
to...String
métodos).O exemplo acima mostra que a data está sendo analisada corretamente - ou seja, na verdade contém uma quantidade de milissegundos correspondente a "2005-07-08T11: 22: 33" no GMT.
fonte
new Date(Date.parse("2005-07-08T11:22:33+0000"))
, e data copiado via construtor:new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
. Ambas as soluções, resultados diferentes, segundo correto! Sua resposta foi útil, apenas mencionada em hunlock.com/blogs/Javascript_Dates-The_Complete_Reference . Acima.Eu tenho o mesmo problema. Recebo uma data como uma String, por exemplo: '2016-08-25T00: 00: 00', mas preciso ter o objeto Date com hora correta. Para converter String em objeto, eu uso getTimezoneOffset:
getTimezoneOffset()
retornará éter valor negativo ou positivo. Isso deve ser subtraído para funcionar em todos os locais do mundo.fonte
var userTimezoneOffset = date.getTimezoneOffset()*60000;
getTimezoneOffset()
retorna o número de minutos na direção oposta que você pensaria - meu fuso horário é UTC-4 agora, masgetTimezoneOffset()
retorna um 240 positivo. Portanto,userTimezoneOffset
deve ser subtraído dedate.getTime()
, e não adicionado a ele.new Date('2016-08-25T00:00:00Z')
eu acho que o ponto foi para manipularnew Date('2016-08-25T00:00:00Z')
para que a hora local é exibida com o tempo 00:00, mas este código perdeuZ
Encontrei o mesmo problema e lembrei-me de algo instável sobre um projeto legado em que estava trabalhando e como eles lidaram com esse problema. Eu não entendi na época e realmente não me importei até me deparar com o problema
Por qualquer motivo, passar a data como '01 -02-2014 'define o fuso horário como zero e ignora o fuso horário do usuário. Pode ser um acaso na classe Date, mas existia há algum tempo e existe hoje. E parece funcionar em vários navegadores. Experimente você mesmo.
Esse código é implementado em um projeto global em que os fusos horários são muito importantes, mas a pessoa que visualiza a data não se importa com o momento exato em que foi introduzida.
fonte
2014/5/31
e2014/05/31
são Sáb 31 de maio de 2014 00:00:00 GMT-0600 (Horário de verão das montanhas) `(MDT é meu fuso horário atual). Com traços ... todos os navegadores interpretam2014-05-31
como Sex May 30 2014 18:00:00 GMT-0600 (Horário de verão das montanhas). Estranhamente, com2014-5-31
, o Chrome retorna sábado, o Firefox retorna sexta-feira e o IE11 diz que a data é inválida. Parece que umdate.replace('-','/')
pode fazer o truque.O
Date
objeto em si conterá o fuso horário de qualquer maneira, e o resultado retornado é o efeito de convertê-lo em string de maneira padrão. Ou seja, você não pode criar um objeto de data sem fuso horário. Mas o que você pode fazer é imitar o comportamento doDate
objeto, criando o seu próprio. É melhor, porém, ser entregue a bibliotecas como o moment.js .fonte
solução simples
fonte
Data em javascript é apenas mantê-lo simples por dentro. portanto, os dados de data e hora são armazenados na época UTC unix (milissegundos ou ms).
Se você deseja ter um horário "fixo" que não seja alterado no fuso horário em que estiver, poderá ajustar o horário no UTC para corresponder ao fuso horário local atual e salvá-lo. E ao recuperá-lo, em qualquer fuso horário local em que você estiver, ele exibirá o horário UTC ajustado com base em quem o salvou e adicionará o deslocamento do fuso horário local para obter o horário "fixo".
Para salvar a data (em ms)
Para recuperar / mostrar a data (em ms)
Então você pode:
fonte
Você pode usar este código
fonte
Como é realmente um problema de formatação ao exibir a data (por exemplo, exibe na hora local), gosto de usar o novo objeto (ish) Intl.DateTimeFormat para executar a formatação, pois é mais explícito e oferece mais opções de saída:
Como mostrado, ao definir o fuso horário como 'UTC', ele não realizará conversões locais. Como bônus, ele também permite que você crie saídas mais polidas. Você pode ler mais sobre o objeto Intl.DateTimeFormat no Mozilla - Intl.DateTimeFormat .
Editar:
A mesma funcionalidade pode ser alcançada sem a criação de um novo
Intl.DateTimeFormat
objeto. Basta passar as opções de localidade e data diretamente para atoLocaleDateString()
função.fonte
Apenas uma nota genérica. uma maneira de mantê-lo flexível.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Podemos usar getMinutes (), mas ele retorna apenas um número nos primeiros 9 minutos.
fonte
(new Date().toString()).replace(/ \w+-\d+ \(.*\)$/,"")
Isso terá saída: ter 10 jul 2018 19:07:11
(new Date("2005-07-08T11:22:33+0000").toString()).replace(/ \w+-\d+ \(.*\)$/,"")
Isso terá saída: Sex Jul 08 2005 04:22:33
Nota: O horário retornado dependerá do fuso horário local
fonte
Esta é a solução que eu encontrei para esse problema que funciona para mim.
biblioteca usada: momentjs com javascript simples Date class.
Etapa 1. Converter a data da String em objeto de momento (PS: moment retém a data e a hora originais, desde que o
toDate()
método não seja chamado):const dateMoment = moment("2005-07-08T11:22:33+0000");
Etapa 2. Extrair
hours
eminutes
valores do objeto de momento criado anteriormente:Etapa 3. Converter momento para data (PS: isso mudará a data original com base no fuso horário do seu navegador / computador, mas não se preocupe e leia a etapa 4.):
Etapa 4. Defina manualmente as horas e minutos extraídos na Etapa 2.
A Etapa 5.
dateObj
agora exibirá a Data original sem nenhuma diferença de fuso horário. Mesmo as alterações do horário de verão não terão efeito no objeto de data, pois estamos definindo manualmente as horas e minutos originais.Espero que isto ajude.
fonte
Existem alguns problemas inerentes à análise de datas que infelizmente não são bem tratados por padrão.
-As datas legíveis por humanos têm fuso horário implícito nelas.
-Há muitos formatos de data amplamente usados na Web que são ambíguos
Para resolver esses problemas de maneira fácil e limpa, seria necessária uma função como esta:
Eu procurei por isso, mas não encontrei nada assim!
Então, eu criei: https://github.com/zsoltszabo/timestamp-grabber
Aproveitar!
fonte