Converter data e hora UTC em hora local

Do servidor eu recebo uma variável datetime neste formato: 6/29/2011 4:52:48 PM e é no horário UTC. Eu quero convertê-lo para o tempo do navegador do usuário atual usando JavaScript.

Como isso pode ser feito usando JavaScript ou jQuery?

Acrescente ‘UTC’ à string antes de convertê-la em uma data em javascript:

 var date = new Date('6/29/2011 4:52:48 PM UTC'); date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)" 

No meu ponto de vista, os servidores sempre devem, em geral, retornar um datetime no formato padronizado ISO 8601 .

Mais informações aqui:

Nesse caso, o servidor retornaria '2011-06-29T16:52:48.000Z' que seria alimentado diretamente no object JS Date.

 var utcDate = '2011-06-29T16:52:48.000Z'; // ISO-8601 formatted date returned from server var localDate = new Date(utcDate); 

O localDate estará na hora certa local que no meu caso seria duas horas mais tarde (hora DK).

Você realmente não precisa fazer toda essa análise, o que complica as coisas, contanto que você seja consistente com o formato esperado do servidor.

Esta é uma solução universal:

 function convertUTCDateToLocalDate(date) { var newDate = new Date(date.getTime()+date.getTimezoneOffset()*60*1000); var offset = date.getTimezoneOffset() / 60; var hours = date.getHours(); newDate.setHours(hours - offset); return newDate; } 

Uso:

 var date = convertUTCDateToLocalDate(new Date(date_string_you_received)); 

Exibe a data com base na configuração local do cliente:

 date.toLocaleString(); 

Você deve obter o deslocamento (UTC) (em minutos) do cliente:

 var offset = new Date().getTimezoneOffset(); 

E, em seguida, faça a adição ou a subtração correspondente ao tempo que você recebe do servidor.

Espero que isto ajude.

Coloque esta function na sua cabeça:

  

Em seguida, gere o seguinte para cada data no corpo da sua página:

  

Para remover o GMT e o fuso horário, altere a seguinte linha:

 document.write(d.toString().replace(/GMT.*/g,"")); 

Use isso para o UTC e conversão de hora local e vice-versa.

 //Covert datetime by GMT offset //If toUTC is true then return UTC time other wise return local time function convertLocalDateToUTCDate(date, toUTC) { date = new Date(date); //Local time converted to UTC console.log("Time: " + date); var localOffset = date.getTimezoneOffset() * 60000; var localTime = date.getTime(); if (toUTC) { date = localTime + localOffset; } else { date = localTime - localOffset; } date = new Date(date); console.log("Converted time: " + date); return date; } 

Depois de tentar alguns outros postados aqui sem bons resultados, isso pareceu funcionar para mim:

 convertUTCDateToLocalDate: function (date) { return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); } 

E isso funciona de maneira oposta, da data local até o UTC:

 convertLocalDatetoUTCDate: function(date){ return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); } 

Para mim, as soluções acima não funcionaram.

Com o IE, a conversão de data e hora UTC para local é um pouco complicada. Para mim, a data e hora da API da web é '2018-02-15T05:37:26.007' e eu queria converter de acordo com o fuso horário local, por isso usei o código abaixo em JavaScript.

 var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z'); 

A resposta de Matt está perdendo o fato de que o horário de verão pode ser diferente entre Date () e a data em que ele precisa ser convertido – eis a minha solução:

  function ConvertUTCTimeToLocalTime(UTCDateString) { var convertdLocalTime = new Date(UTCDateString); var hourOffset = convertdLocalTime.getTimezoneOffset() / 60; convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset ); return convertdLocalTime; } 

E os resultados no depurador:

 UTCDateString: "2014-02-26T00:00:00" convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time) 

Esta é uma solução simplificada baseada na resposta da Adorjan Princ:

 function convertUTCDateToLocalDate(date) { var newDate = new Date(date); newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset()); return newDate; } 

Uso:

 var date = convertUTCDateToLocalDate(new Date(date_string_you_received)); 

Caso você não se importe em usar o moment.js e o seu tempo seja em UTC, basta usar o seguinte:

 moment.utc('6/29/2011 4:52:48 PM').toDate(); 

Se o seu tempo não estiver no utc, mas em qualquer outro local conhecido, use o seguinte:

 moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate(); 

Se o seu tempo já estiver no local, use o seguinte:

 moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY'); 

Isso funciona para mim:

 function convertUTCDateToLocalDate(date) { var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000); return newDate; } 

Para mim, o mais simples parecia usar

 datetime.setUTCHours(datetime.getHours()); datetime.setUTCMinutes(datetime.getMinutes()); 

(Eu pensei que a primeira linha poderia ser suficiente, mas há fusos horários que estão fora em frações de horas)

Usando o YYYY-MM-DD hh:mm:ss :

 var date = new Date('2011-06-29T16:52:48+00:00'); date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)" 

Para converter do YYYY-MM-DD hh:mm:ss , certifique-se de que sua data siga o formato ISO 8601 .

 Year: YYYY (eg 1997) Year and month: YYYY-MM (eg 1997-07) Complete date: YYYY-MM-DD (eg 1997-07-16) Complete date plus hours and minutes: YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00) Complete date plus hours, minutes and seconds: YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00) Complete date plus hours, minutes, seconds and a decimal fraction of a second YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) where: YYYY = four-digit year MM = two-digit month (01=January, etc.) DD = two-digit day of month (01 through 31) hh = two digits of hour (00 through 23) (am/pm NOT allowed) mm = two digits of minute (00 through 59) ss = two digits of second (00 through 59) s = one or more digits representing a decimal fraction of a second TZD = time zone designator (Z or +hh:mm or -hh:mm) 

Coisas importantes para anotar

  1. Você deve separar a data e a hora por um T , um espaço não funcionará em alguns navegadores
  2. Você deve definir o fuso horário usando este formato +hh:mm , usando uma string para um fuso horário (ex .: ‘UTC’) não funcionará em muitos navegadores. +hh:mm representa o deslocamento do fuso horário UTC.

Uma sequência de datas JSON (serializada em C #) se parece com “2015-10-13T18: 58: 17”.

Em angular, (seguindo Hulvej) faça um filtro de data local:

 myFilters.filter('localdate', function () { return function(input) { var date = new Date(input + '.000Z'); return date; }; }) 

Em seguida, exiba a hora local como:

 {{order.createDate | localdate | date : 'MMM d, yh:mm a' }} 

Eu Respondendo Isto Se Qualquer um quiser uma function que exiba o tempo convertido para um elemento id específico e aplique a string de formato de data aaaa-mm-dd aqui date1 é string e ids é o id do elemento que o tempo vai exibir.

 function convertUTCDateToLocalDate(date1, ids) { var newDate = new Date(); var ary = date1.split(" "); var ary2 = ary[0].split("-"); var ary1 = ary[1].split(":"); var month_short = Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); newDate.setUTCHours(parseInt(ary1[0])); newDate.setUTCMinutes(ary1[1]); newDate.setUTCSeconds(ary1[2]); newDate.setUTCFullYear(ary2[0]); newDate.setUTCMonth(ary2[1]); newDate.setUTCDate(ary2[2]); ids = document.getElementById(ids); ids.innerHTML = " " + newDate.getDate() + "-" + month_short[newDate.getMonth() - 1] + "-" + newDate.getFullYear() + " " + newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds(); } 

Eu sei que a resposta já foi aceita, mas eu chego aqui causa do google e resolvi com a obtenção de inspiração de resposta aceite, então eu queria apenas compartilhá-lo se alguém precisar.

Com base na resposta @digitalbath, aqui está uma pequena function para capturar o timestamp UTC e exibir a hora local em um determinado elemento DOM (usando jQuery para esta última parte):

https://jsfiddle.net/moriz/6ktb4sv8/1/

 

@Adorojan's resposta está quase correta. Mas a adição do deslocamento não está correta, pois o valor do deslocamento será negativo se a data do navegador estiver adiantada em relação ao GMT e vice-versa. Abaixo está a solução com a qual eu vim e está funcionando perfeitamente bem para mim:

 // Input time in UTC var inputInUtc = "6/29/2011 4:52:48"; var dateInUtc = new Date(Date.parse(inputInUtc+" UTC")); //Print date in UTC time document.write("Date in UTC : " + dateInUtc.toISOString()+"
"); var dateInLocalTz = convertUtcToLocalTz(dateInUtc); //Print date in local time document.write("Date in Local : " + dateInLocalTz.toISOString()); function convertUtcToLocalTz(dateInUtc) { //Convert to local timezone return new Date(dateInUtc.getTime() - dateInUtc.getTimezoneOffset()*60*1000); }

Eu escrevi um pequeno script que leva uma época UTC e converte o fuso horário do sistema do cliente e retorna-o no formato d / m / YH: i: s (como a function de data do PHP):

 getTimezoneDate = function ( e ) { function p(s) { return (s < 10) ? '0' + s : s; } var t = new Date(0); t.setUTCSeconds(e); var d = p(t.getDate()), m = p(t.getMonth()+1), Y = p(t.getFullYear()), H = p(t.getHours()), i = p(t.getMinutes()), s = p(t.getSeconds()); d = [d, m, Y].join('/') + ' ' + [H, i, s].join(':'); return d; }; 

Adicione o fuso horário no final, neste caso, ‘UTC’:

 theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC')); 

Depois disso, use toLocale () * famílias de funções para exibir a data na localidade correta

 theDate.toLocaleString(); // "6/29/2011, 9:52:48 AM" theDate.toLocaleTimeString(); // "9:52:48 AM" theDate.toLocaleDateString(); // "6/29/2011" 
 function getUTC(str) { var arr = str.split(/[- :]/); var utc = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]); utc.setTime(utc.getTime() - utc.getTimezoneOffset()*60*1000) return utc; } 

Para outras pessoas que visitam – use essa function para obter um object de data local de uma string UTC, deve cuidar do horário de verão e funcionará no IE, IPhone etc.

Dividimos a string (Como a análise de data JS não é suportada em alguns navegadores) Obtemos a diferença do UTC e a subtrai da hora UTC, o que nos dá a hora local. Como o offset retornado é calculado com o DST (corrija-me se estiver errado), então ele ajustará esse tempo de volta na variável “utc”. Finalmente, retorne o object de data.

Em Angular, usei a resposta de Ben dessa maneira:

 $scope.convert = function (thedate) { var tempstr = thedate.toString(); var newstr = tempstr.toString().replace(/GMT.*/g, ""); newstr = newstr + " UTC"; return new Date(newstr); }; 

Editar: Angular 1.3.0 adicionou suporte UTC para filtro de data, eu não tenho usado ainda, mas deve ser mais fácil, aqui está o formato:

 {{ date_expression | date : format : timezone}} 

Angular 1.4.3 Date API