Suponha que um usuário do seu site insira um período.
2009-1-1 to 2009-1-3
Você precisa enviar esta data para um servidor para algum processamento, mas o servidor espera que todas as datas e horários estejam no UTC.
Agora, suponha que o usuário esteja no Alasca, Havaí ou Fiji. Como eles estão em um fuso horário bem diferente do UTC, o período precisa ser convertido para algo assim:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
Usando o objeto Data JavaScript, como você converteria o primeiro período "localizado" em algo que o servidor entenderá?
javascript
date
utc
dthrasher
fonte
fonte
Respostas:
Fonte: documentos da Web MDN
O formato que você precisa é criado com o
.toISOString()
método Para navegadores mais antigos (ie8 e inferiores), que não oferecem suporte nativo a esse método, o shim pode ser encontrado aqui :Isso lhe dará a capacidade de fazer o que você precisa:
Para o trabalho do fuso horário, o fuso horário moment.js e moment.js são ferramentas realmente inestimáveis ... especialmente para navegar nos fusos horários entre o javascript do cliente e o servidor.
fonte
toISOString
se adequadamente converter em UTC[toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offset
Também no exemplo, eles mostram o deslocamento é contabilizado quando toISOString é chamadoSimples e estúpido
fonte
function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
new Date(new Date().toUTCString().substr(0, 25))
now.toUTCSTring()
vez de (errado)now_utc.toString()
.Aqui está o meu método:
O
utc
objeto resultante não é realmente uma data UTC, mas uma data local mudou para corresponder à hora UTC (ver comentários). No entanto, na prática, ele faz o trabalho.fonte
Date.now()
indica a hora local e não a hora UTC, e essa solução parece a mais simples para mim. Pelo menos no meu caso, em que quero horário UNIX e não uma sequência bem formatada. (a única diferença era que eu multiplicar por60 * 1000
apenas para ser mais claro :))now.toString()
comutc.toString()
: não há mudança de fuso horário, mas alteração de tempo, que é uma coisa completamente diferente. No entanto, uma solução mais limpa seria bem mais complexa (acho que sim), e esse código funciona na grande maioria dos casos, desde que não se lide mais com fusos horários. Isso me fez lembrar do soco de pato : coisa diferente, mas feita para se comportar da mesma maneira. Observe também que o código do DrunkCoder tem o mesmo problema.fonte
Converta para ISO sem alterar a data / hora
Converta para ISO com alteração de data / hora (a data / hora será alterada)
Fiddle link
fonte
Os navegadores podem ser diferentes, e você também deve se lembrar de não confiar em nenhuma informação gerada pelo cliente; a declaração abaixo funciona para mim (Google Chrome v24 no Mac OS X 10.8.2)
var utcDate = new Date(new Date().getTime());
edit: "Como isso é diferente do que apenas
new Date()
?" veja aqui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateA adição do 60000 * Date.getTimezoneOffset () como as respostas anteriores declararam está incorreta. Primeiro, você deve pensar em todas as datas / horas como já sendo UTC com um modificador de fuso horário para fins de exibição.
Mais uma vez, os navegadores podem diferir, no entanto, Date.getTime () retorna o número de milissegundos desde 01-01-2009 UTC / GMT. Se você criar uma nova Data usando esse número, como eu fiz acima, será UTC / GMT. No entanto, se você exibi-lo chamando .toString (), ele parecerá estar no fuso horário local porque .toString () usa o fuso horário local, não o fuso horário do objeto Date em que é chamado.
Também descobri que, se você chamar .getTimezoneOffset () em uma data, ele retornará seu fuso horário local, não o fuso horário do objeto de data em que você o chamou (no entanto, não posso verificar isso como padrão).
No meu navegador, adicionar 60000 * Date.getTimezoneOffset () cria um DateTime que não é UTC . No entanto, quando exibido no meu navegador (por exemplo: .toString ()), ele exibe um DateTime no meu fuso horário local que estaria no horário UTC correto se as informações do fuso horário forem ignoradas.
fonte
new Date()
, nem timestamp nem fuso horário é alteradonew Date().getTime()
sempre retornará um carimbo de data / hora independente do fuso horário. Não há registro de data e hora associado a ele até que você tente formatá-lo em algo diferente do número de milissegundos desde a época do Unix.new Date(new Date().getTime())
retorna exatamente o mesmo valor quenew Date()
. Você pode explicar em que sentido sua resposta fornece um valor distintonew Date()
?new Date("5/19/2014").getTime()
. O construtor Date criou uma data com um deslocamento de +7. No servidor (C #), adiciono o valor publicado como milissegundos à época do unixnew DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)
. O resultado é5/19/2014 7:00:00 AM
. Parece que getTime () fornece o número de milissegundos, incluindo meu deslocamento UTC.new Date(new Date().getTime())
não funcionam. Posso confirmar quenew Date(Date.UTC(2019, 8, 27, 0, 0, 0))
realmente produz a hora UTC. Se você não usar,Date.UTC(...)
você receberá as datas no deslocamento UTC no seu fuso horário.fonte
Outra solução para converter para UTC e mantê-la como um objeto de data: (funciona removendo a parte 'GMT' do final da string formatada e colocando-a novamente no construtor Date)
Eu precisava fazer isso para fazer interface com uma biblioteca de selecionador de data e hora. Mas, em geral, é uma má idéia trabalhar com datas dessa maneira.
Os usuários geralmente desejam trabalhar com data e hora no horário local; portanto, você atualiza o código do lado do servidor para analisar as seqüências de horas e horários com desvios corretamente e depois converte para UTC (melhor opção) ou para uma string UTC no lado do cliente antes de enviar para o servidor (como na resposta de Will Stern)
fonte
Você está tentando converter a data em uma string como essa?
Eu faria uma função para fazer isso e, embora seja um pouco controverso, adicione-o ao protótipo Date. Se você não estiver satisfeito com isso, poderá colocá-lo como uma função independente, passando a data como parâmetro.
Se você precisar no horário UTC, substitua todas as funções get * por getUTC *, por exemplo: getUTCFullYear, getUTCMonth, getUTCHours ... e depois adicione "+00: 00" no final, em vez do deslocamento do fuso horário do usuário.
fonte
String(temp)
desde que a outra maneira ("" + temp
) é relatada como um erro JSLint nos dias de hoje.toISOString
métododeve funcionar na maioria dos navegadores mais recentes. retorna
2012-07-28T00:00:00.000Z
no Firefox 6.0fonte
Minha recomendação ao trabalhar com datas é analisar a data em campos individuais a partir da entrada do usuário. Você pode usá-lo como uma corda completa, mas está brincando com fogo.
O JavaScript pode tratar duas datas iguais em diferentes formatos de maneira diferente.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
Nunca faça nada como:
Depois de analisar sua data em seus campos individuais a partir da entrada do usuário, crie um objeto de data. Depois que o objeto de data é criado, converta-o para UTC adicionando o deslocamento do fuso horário. Não posso enfatizar a importância de usar o deslocamento do objeto de data devido ao horário de verão (no entanto, essa é outra discussão para mostrar o porquê).
Agora você pode passar a data para o servidor no horário UTC. Novamente, eu recomendo não usar nenhuma sequência de datas. Passe-o para o servidor dividido na menor granularidade necessária, por exemplo, ano, mês, dia, minuto ou como um valor em milissegundos da época do unix.
fonte
Se você lida muito com datas, vale a pena usar o moment.js ( http://momentjs.com ). O método para converter para UTC seria:
Você pode usar o formato para alterar sua data para qualquer formato que desejar:
Também existem opções de deslocamento no momento, mas há uma biblioteca complementar adicional para lidar com o fuso horário ( http://momentjs.com/timezone/ ). A conversão de tempo seria tão simples como esta:
fonte
moment(yourTime).utc()
emoment.utc(yourTime)
? Eu costumo usar o último.Minha solução mantém a data a mesma, independentemente do fuso horário definido no lado do cliente. Talvez alguém ache útil.
Meu caso de uso:
Estou criando um aplicativo de tarefas, onde você define a data da sua tarefa. Essa data deve permanecer constante, independentemente do fuso horário em que você estiver.
Exemplo. Você quer ligar para seu amigo às 8 da manhã de 25 de junho.
Você cria esta tarefa 5 dias antes (20 de junho) enquanto estiver na China.
Então, no mesmo dia, você voa para Nova York por alguns dias.
Então, em 25 de junho, enquanto você ainda está em Nova York, você acorda às 7:30 da manhã (o que significa que você deve receber uma notificação de tarefa em 30 minutos) tarefa)
Portanto, a tarefa está ignorando o fuso horário. Significa 'Eu quero fazer isso às 8 da manhã em qualquer fuso horário em que estarei'.
O que faço é dizer "presumo que você esteja sempre no fuso horário de Londres - UTC".
O que isso significa é - quando o usuário escolhe uma data em seu fuso horário - eu converto essa data para a mesma data no UTC. ie Você escolhe 8 da manhã na China, mas eu a converto para 8 da manhã no UTC.
Então - da próxima vez que você abrir o aplicativo - eu li a data salva no UTC e a converto para a mesma data no seu fuso horário atual - por exemplo. Eu converto 8 da manhã no UTC para 8 da manhã no fuso horário de Nova York.
Essa solução significa que a data pode significar outra coisa, dependendo de onde você está ao defini-la e de onde está lendo, mas permanece constante de uma maneira que parece que você está sempre no mesmo fuso horário.
Vamos escrever um código:
Primeiro - temos 2 funções principais para converter de / para UTC, ignorando o fuso horário:
Em seguida, salvei / li esta data como:
fonte
Acabei de descobrir que a versão 1.2.3 do date.format.js de Steven Levithan faz exatamente o que eu quero. Ele permite que você forneça uma string de formato para uma data JavaScript e converte da hora local para o UTC. Aqui está o código que estou usando agora:
fonte
Encontrei o jQuery Globalization Plugin data da análise do para funcionar melhor. Outros métodos tinham problemas entre navegadores e coisas como date.js não eram atualizadas há um bom tempo.
Você também não precisa de um datePicker na página. Você pode simplesmente chamar algo semelhante ao exemplo dado nos documentos:
fonte
Esta função funciona muito bem para mim.
fonte
Usando o método UTC moment.js ;
fonte
Isso fornecerá a data e hora UTC apropriadas.
É porque
getTimezoneOffset()
isso lhe dará a diferença de fuso horário em minutos. Eu recomendo que você não use,toISOString()
porque a saída estará na cadeia. Portanto, no futuro, você não poderá manipular a datafonte
Isto é o que eu fiz no passado:
fonte
Se você precisar do objeto Data
Passar apenas a sequência de datas Date assume que a hora será 00:00 alterada pelo fuso horário:
Se você adicionar horas e minutos atuais, obtém a data adequada:
fonte
Observando a sua pergunta, fica claro que você deseja enviar o período ao seu back-end para posterior processamento posterior.
Suponho que você esteja em conformidade com as diretrizes de dados padrão que esperam que os dados estejam em um formato específico. Por exemplo, eu uso ODATA, que é uma API RESTfull que espera que os objetos de data e hora estejam no formato: -
Isso pode ser facilmente alcançado através do snippet publicado abaixo (altere o formato conforme sua exigência).
var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";
Se, por outro lado, você estiver na minha situação em que você recebeu uma data do seu back-end e o navegador a converte na sua data local. Por outro lado, você está interessado na data UTC e pode executar o seguinte: -
var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);
O trecho de código acima basicamente adiciona / subtrai o tempo adicionado / subtraído pelo navegador com base no fuso horário.
Por exemplo, se estou em EST (GMT-5) e meu Serviço retorna um objeto de data e hora = Wed Aug 17 2016 00:00:00 GMT-0500, meu navegador subtrai automaticamente o deslocamento do fuso horário (5 horas) para obter meu horário local. Portanto, se eu tentar obter o horário, recebo Wed 16 de agosto de 2016 19:00:00 GMT-0500. Isso causa muitos problemas. Existem muitas bibliotecas por aí que definitivamente tornarão isso mais fácil, mas eu queria compartilhar a abordagem JS pura.
Para obter mais informações, consulte: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ onde eu recebi meu inspiração.
Espero que isto ajude!
fonte
Este método fornecerá:
2017-08-04T11:15:00.000+04:30
e você pode ignorar a variável de zona para simplesmente obter2017-08-04T11:15:00.000
.fonte
Usando o pacote moment, você pode facilmente converter uma sequência de datas do UTC em um novo objeto Date:
Isso ajuda especialmente quando o servidor não suporta fuso horário e você deseja armazenar a data UTC sempre no servidor e recuperá-la como um novo objeto Date. O código acima funcionou para o meu requisito de problema semelhante ao qual este segmento é. Compartilhando aqui para que possa ajudar os outros. Não vejo exatamente a solução acima em nenhuma resposta. Obrigado.
fonte
evento const = nova data ();
console.log (event.toUTCString ());
fonte
Eu sei que essa pergunta é antiga, mas estava analisando o mesmo problema, e uma opção seria enviar date.valueOf () para o servidor. a função valueOf () do javascript Date envia o número de milissegundos desde meia-noite de 1º de janeiro de 1970, UTC.
valor de()
fonte
Portanto, era dessa maneira que eu fazia isso porque eu ainda queria que um objeto de data JavaScript manipulasse como uma data e, infelizmente, muitas dessas respostas exigem que você vá para uma string.
fonte
adicionar momento
fonte
Ainda mais simples
fonte
setTime
dependenew Date
, que você não está incluindo. Por favor, complete a resposta.