Como você converte uma data JavaScript para UTC?


590

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á?


10
ressuscitou isso porque foi o principal hit do Google para mim e os navegadores mais novos têm suporte interno para as sequências de datas UTC.
jcomeau_ictx

4
Atualizei a resposta aceita para destacar o novo método toMAOString () do ECMAscript 5. Veja stackoverflow.com/a/11957822/19112
dthrasher

5
Então, em 2015, eu tenho que mexer com datas de string e análise? ridículo!
Toolkit

2
Claro que você tem. Você nunca pode confiar em alguém fazendo o trabalho para você :-P Pelo menos até o mundo parar de usar fusos horários e começar a unificar as datas e as horas.
Erenor Paz

4
"Stardates", de preferência.
Michael Daw

Respostas:


370

O toISOString()método retorna uma sequência no formato ISO estendido simplificado ( ISO 8601 ), que sempre possui 24 ou 27 caracteres ( YYYY-MM-DDTHH:mm:ss.sssZou ±YYYYYY-MM-DDTHH:mm:ss.sssZ, respectivamente). O fuso horário é sempre o deslocamento UTC zero, conforme indicado pelo sufixo " Z".

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:

var isoDate = new Date('yourdatehere').toISOString();

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.


81
realmente este converte o objeto data para uma cadeia, não será capaz de fazer outras operações de data nele
orszaczky

2
@TheRebel, o caso de uso fornecido é que ele precisa enviar ao servidor uma string formatada.
Will Stern

28
@ Will, você está totalmente certo, mas - assim como a maioria dos espectadores aqui assumo - cheguei aqui com base no título, pesquisando a data geral do JS para a conversão UTC, então achei útil mencioná-lo aqui :)
orszaczky 6/09/14

4
Cuidado ao usar este método! Ele não cria uma data UTC - formata os dados de data existentes como estão no formato UTC e fornece um fuso horário "Z". Isso está errado 99% do tempo! Você deve converter a data no fuso horário GMT antes de usar este método!
User1944491

5
@ user1944491 Não acho que isso esteja correto. De acordo com os docs MDN, toISOStringse adequadamente converter em UTC [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offsetTambém no exemplo, eles mostram o deslocamento é contabilizado quando toISOString é chamado
FFF

560

Simples e estúpido

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

85
Gostei da sua ideia e fiz um método que tenho usado várias vezes. function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
Tim

21
O código mais curto que eu new Date(new Date().toUTCString().substr(0, 25))
criei

17
Observe que getUTCMonth () retorna os valores de 0 a 11. Portanto, se você está precisando do mês por número, em vez de uma sequência, ajuda com +1 no valor.
Talvi Watia

19
Isso não faz sentido. A nova data terá um valor diferente do que você realmente deseja. Basta usar em now.toUTCSTring()vez de (errado) now_utc.toString().
Bergi

22
Eu não usaria isso - usando o novo Date (), você obtém o fuso horário do navegador. no Chrome 29 e IE10, a data + tempo parecem ser correto, mas o fuso horário é definido para fuso horário do navegador, o que poderia causar problemas ...
Sean

207

Aqui está o meu método:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

O utcobjeto 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.


Eu estava olhando para esse problema quando percebi que 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 por 60 * 1000apenas para ser mais claro :))
Timothée Boucher

18
A adição do 60000 * Date.getTimezoneOffset () 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. Os navegadores podem diferir, no entanto, Date.getTime () retorna o número de milissegundos desde 01-01 1970. Se você criar uma nova data usando esse número, ex: new Date (Date.getTime ()); ele será UTC , no entanto, quando você exibi-lo (ex: através do cromo consola ferramentas dev) aparecerá para ser o seu fuso horário local.
Aaron Hoffman

15
No meu navegador, isso cria um DateTime que não é UTC. No entanto, quando exibido no meu navegador, isso 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.
Aaron Hoffman

Entendi, ponto interessante. Vamos comparar now.toString()com utc.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.
Gras Double

4
Essa resposta demonstra outra implementação comum de "mudança de época", que é perigosa isoladamente, pois pode falhar em casos próximos, como transições de horário de verão. Não recomendado.
Matt Johnson-Pint

25
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

Isso funciona bem. Eu só precisava substituir o "-" nas datas de origem por "/" para criar uma data JavaScript, então eu poderia chamar sua função toISO () para obter a saída correta.
dthrasher

isso funciona muito bem. Você também pode alimentar o resultado no jQuery $ .parseDate (...) para recuperar um objeto de data que foi alterado para UTC.
Brian Ellis

23

Converta para ISO sem alterar a data / hora

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

Converta para ISO com alteração de data / hora (a data / hora será alterada)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

Fiddle link


então isso é meio que fingir UTC? Altero minha data local e consigo enviar ao servidor a data e a hora que realmente vejo no relógio do meu PC. Uau. Enfim, melhor do que estrinificar e analisar #
Toolkit

Além disso, você não precisa do .toISOString (), basta enviar o isoDate ao servidor #
Toolkit

.toISOString () é simples e direto, obter uma data extra será uma etapa extra (isoDate não é uma função).
precisa

Você não precisa adicionar o deslocamento em vez de subtraí-lo? Consulte stackoverflow.com/a/11964609/832230
Acumenus

@ABB Se o deslocamento atual do fuso horário for + ve, devemos subtraí-lo (no nosso caso, o IST é +5: 30), caso contrário, adicione.
precisa

18

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/Date

  • Se nenhum argumento for fornecido, o construtor criará um objeto Data do JavaScript para a data e hora atuais, de acordo com as configurações do sistema.
  • Nota: Onde Date é chamado como um construtor com mais de um argumento, os argumentos especificados representam a hora local. Se UTC for desejado, use a nova Data ( Date.UTC (...) ) com os mesmos argumentos. (note: Date.UTC () retorna o número de milissegundos desde 1970-01-01 00:00:00 UTC)

A 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.


11
Eu corri este código em Fx e Chrome, ele não parece trabalho: o resultado é exatamente o mesmo que a partir new Date(), nem timestamp nem fuso horário é alterado
Gras Duplo

3
Isso ocorre porque os carimbos de data e hora não têm fuso horário. new 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.
Frontendbeauty

7
Tanto quanto eu posso dizer new Date(new Date().getTime())retorna exatamente o mesmo valor que new Date(). Você pode explicar em que sentido sua resposta fornece um valor distinto new Date()?
precisa

Estou postando esse valor no meu servidor 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 unix new 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.
Xr280xr

1
Há muitos comentários reclamando que new Date(new Date().getTime())não funcionam. Posso confirmar que new 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.
Alex Barker

15
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

1
O objeto de data precisa realmente ser definido como uma data. Acima é apenas um exemplo.
James Skidmore

5
Agora ele retorna "Qui, 04 de junho de 2009 04:10:56 GMT", que não é o formato ISO exigido no OP.
nickf

4
Isso o transforma em uma sequência de caracteres, que não é uma data
Anthony

2
não, na verdade deve ser uma representação em cadeia de uma data de acordo com o OP.
jcomeau_ictx

3
Após a conversão para UTC ele está retornando no formato de cadeia, em seguida, como métodos de acesso como getMonth (), getDate (), etc.
Sandeep areia

10

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)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

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)


7

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.

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

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.


1
Este é o primeiro exemplo que eu vi que tenta lidar com o deslocamento do fuso horário, então +1 para isso. No entanto, encontrei algumas coisas com ele - temp.substr (-2) causa um erro porque é um número, não uma string, então você precisa fazer algo como "temp = '' + temp;" primeiro, transformá-lo em uma string. Além disso, prefiro minhas datas ISO com preenchimento zero - acho que isso as torna mais padrão.
Mick Sear

@ Mike - Eu atualizei para corrigir esse bug. Eu usei String(temp)desde que a outra maneira ( "" + temp) é relatada como um erro JSLint nos dias de hoje.
nickf

Isto agora é padronizado como o toISOStringmétodo
Bergi

7
date = '2012-07-28'; stringdate = new Date(date).toISOString();

deve funcionar na maioria dos navegadores mais recentes. retorna 2012-07-28T00:00:00.000Zno Firefox 6.0


7

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:

new Date('date as text');

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ê).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

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.


Para sua informação, o getYear está sendo removido dos padrões da web developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
Ghan

6

Se você lida muito com datas, vale a pena usar o moment.js ( http://momentjs.com ). O método para converter para UTC seria:

moment(yourTime).utc()

Você pode usar o formato para alterar sua data para qualquer formato que desejar:

moment(yourTime).utc().format("YYYY-MM-DD")

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:

moment.tz(yourUTCTime, "America/New_York")

qual é a diferença entre moment(yourTime).utc()e moment.utc(yourTime)? Eu costumo usar o último.
Ps0604

5

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:

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

Em seguida, salvei / li esta data como:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

4

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:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

9
Esta não parece ser a melhor resposta para sua pergunta. Você deve reconsiderar algo que responda diretamente à sua pergunta ou faça sua pergunta de maneira diferente.
precisa saber é o seguinte

1
Por acaso estou corrigindo esse script (e versão) exato, porque é insuficiente para o IE7 e o Firefox.
Barbarrosa

4

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:

$.parseDate('yy-mm-dd', '2007-01-26');

1
Só porque algo não foi atualizado, não significa que você não deve usá-lo. O Date.js funciona tão perfeitamente há anos, portanto não precisa ser atualizado. O objeto JS Date e os formatos de data em uso não foram alterados nos últimos anos, então por que o script que os manipula? O Date.JS é absolutamente a melhor biblioteca JS Date existente. Existem alguns problemas no github, mas, caso contrário, é perfeito. github.com/datejs/Datejs
thugsb

3

Esta função funciona muito bem para mim.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}


2
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

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 data


2

Isto é o que eu fiz no passado:

var utcDateString = new Date(new Date().toUTCString()).toISOString();

2

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:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

Se você adicionar horas e minutos atuais, obtém a data adequada:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

1

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: -

AAAA-MM-DDT00: 00: 00.

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!


1

Este método fornecerá: 2017-08-04T11:15:00.000+04:30e você pode ignorar a variável de zona para simplesmente obter 2017-08-04T11:15:00.000.

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

1

Usando o pacote moment, você pode facilmente converter uma sequência de datas do UTC em um novo objeto Date:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

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.


4
Mesmo que isso possa responder à pergunta, não há explicação para o seu código. Atualize sua resposta para fornecer uma explicação do que você está fazendo. Obrigado!
Miroslav Glamuzina 04/04/19


0

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()


0

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.

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

0

adicionar momento

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

Ainda mais simples

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

2
Isso está incompleto. setTimedepende new Date, que você não está incluindo. Por favor, complete a resposta.
random_user_name 26/09/12

este homem ainda está vivo? por que nem voltar para nós, contar alguma coisa ou editar a resposta?
Hopeless
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.