No servidor, recebo uma variável datetime neste formato: 6/29/2011 4:52:48 PMe é no horário UTC. Quero convertê-lo para o horário do navegador do usuário atual usando JavaScript.
Como isso pode ser feito usando JavaScript ou jQuery?
Seja cuidadoso. Esse é um formato de data estranho, portanto, especifique-o em qualquer solução usada. Se possível, peça ao servidor para enviar a data no formato ISO.
Michael Scheper
Respostas:
402
Anexe 'UTC' à string antes de convertê-la em uma data em javascript:
var date =newDate('6/29/2011 4:52:48 PM UTC');
date.toString()// "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
função localizeDateStr (date_to_convert_str) {var date_to_convert = nova data (date_to_convert_str); var local_date = nova data (); date_to_convert.setHours (date_to_convert.getHours () + local_date.getTimezoneOffset ()); return date_to_convert.toString (); }
mate
4
@ Matt compensar retornos minutos, não em horas, é preciso dividir por 60
Bladefist
50
Isso pressupõe que a parte da data da sequência esteja seguindo o padrão dos EUA, mm / dd / AAAA, o que obviamente não é o caso na Europa e em outras partes do mundo.
AsGoodAsItGets
7
@digitalbath Funciona no Chrome, mas não no Firefox.
Não funciona com todos os fusos horários. Há uma boa razão pela qual getTimeZoneOffset está em minutos! geographylists.com/list20d.html
siukurnin
5
@siukurnin. Então, para gerenciar um fuso horário estranho, use newDate.setTime (date.getTime () + date.getTimezoneOffset () * 60 * 1000)
7500 Guillaume Gendre
18
newDate.setMinutes (date.getMinutes () - date.getTimezoneOffset ()) seria suficiente. Corrige também as horas
Lu55 23/10/2013
11
Certamente isso não pode funcionar para qualquer fuso horário que esteja a 30 minutos? Parece arredondar para horas inteiras.
NickG
2
Isso também não parece definir a data corretamente quando o turno do fuso horário cruza a meia-noite; possivelmente porque está usando setHours, o que não afeta a data?
Uniphonic:
37
Você deve obter o deslocamento (UTC) (em minutos) do cliente:
var offset =newDate().getTimezoneOffset();
E então faça a adição ou subtração correspondente ao tempo que você obtém do servidor.
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 conforme o fuso horário local, então usei o código abaixo em JavaScript.
var createdDateTime =newDate('2018-02-15T05:37:26.007'+'Z');
Menos código para usar new Date(+date + date.getTimezoneOffset() * 6e4). ;-)
RobG 21/09
não funcionará, meu tempo no utc é "2020-04-02T11: 09: 00", então tentei isso em Cingapura, nova data (+ nova data ("2020-04-02T11: 09: 00") + nova data ( "2020-04-02T11: 09: 00"). GetTimezoneOffset () * 6e4), fornecendo hora errada
AhammadaliPK
isso funcionou, nova data ("2020-04-02T11: 09: 00" + 'Z');
AhammadaliPK
10
Adicione o fuso horário no final, neste caso 'UTC':
A resposta de Matt está ausente do fato de que o horário de verão pode ser diferente entre Date () e o horário que ele precisa converter - eis a minha solução:
Use isso para converter UTC e hora local e vice-versa.
//Covert datetime by GMT offset //If toUTC is true then return UTC time other wise return local timefunction convertLocalDateToUTCDate(date, toUTC){
date =newDate(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 =newDate(date);
console.log("Converted time: "+ date);return date;}
Alguém tem algum problema com isso? Esta parece ser a melhor opção para mim. Peguei uma string UTC que tinha "(UTC)" no final dela, configurei-a como um objeto Date usando new Date('date string')e, em seguida, adicionei essas duas linhas e parece estar voltando com um horário baseado completamente no carimbo de data / hora UTC do servidor com ajustes feitos para corresponder à hora local do usuário. Eu precisa se preocupar com as fracções de-an-hour estranhas fusos horários também ... Não tenho certeza se ele mantém-se perfeitamente o tempo todo ...
tylerl
tentei muitas outras opções, nenhuma delas funcionou, mas isso está funcionando #
Sameera K
5
Uma sequência de datas JSON (serializada em C #) se parece com "2015-10-13T18: 58: 17".
Em angular, (seguindo Hulvej) faça um localdatefiltro:
myFilters.filter('localdate',function(){returnfunction(input){var date =newDate(input +'.000Z');return date;};})
Em seguida, exiba a hora local como:
{{order.createDate | localdate | date :'MMM d, y h:mm a'}}
var date =newDate('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:ssformato, verifique se a sua data segue 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 a serem observadas
Você deve separar a data e a hora com a T, um espaço não funcionará em alguns navegadores
Você deve definir o fuso horário usando este formato +hh:mm, o uso de uma sequência de caracteres para um fuso horário (por exemplo: 'UTC') não funcionará em muitos navegadores. +hh:mmrepresenta o deslocamento do fuso horário UTC.
@Adorojan'sa 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 que eu vim com e está funcionando perfeitamente para mim:
// Input time in UTCvar inputInUtc ="6/29/2011 4:52:48";var dateInUtc =newDate(Date.parse(inputInUtc+" UTC"));//Print date in UTC time
document.write("Date in UTC : "+ dateInUtc.toISOString()+"<br>");var dateInLocalTz = convertUtcToLocalTz(dateInUtc);//Print date in local time
document.write("Date in Local : "+ dateInLocalTz.toISOString());function convertUtcToLocalTz(dateInUtc){//Convert to local timezonereturnnewDate(dateInUtc.getTime()- dateInUtc.getTimezoneOffset()*60*1000);}
Eu respondendo a isso se alguém quiser uma função que mostre a hora convertida em um elemento de identificação específico e aplique o formato de data string aaaa-mm-dd aqui date1 é string e ids é a identificação do elemento que a hora será exibida.
Eu sei que a resposta já foi aceita, mas eu cheguei aqui porque o google e resolvi obtendo inspiração da resposta aceita, então eu queria apenas compartilhá-la se alguém precisar.
Com base na resposta @digitalbath, aqui está uma pequena função para pegar o carimbo de data / hora UTC e exibir a hora local em um determinado elemento DOM (usando jQuery para esta última parte):
<div id="eventTimestamp"class="timeStamp"></div><script type="text/javascript">// Convert UTC timestamp to local time and display in specified DOM elementfunction convertAndDisplayUTCtime(date,hour,minutes,elementID){var eventDate =newDate(''+date+' '+hour+':'+minutes+':00 UTC');
eventDate.toString();
$('#'+elementID).html(eventDate);}
convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp');</script>
Eu escrevi um pequeno script que leva uma época do UTC e o converte no fuso horário do sistema do cliente e o retorna no formato d / m / YH: i: s (como a função de data do PHP):
getTimezoneDate =function( e ){function p(s){return(s <10)?'0'+ s : s;}var t =newDate(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;};
É simples, você acabou de mencionar o local do fuso horário.
Exemplo: para converter seu horário e data para fuso horário da Ásia / Calcutá, basta mencionar o nome do local do fuso horário obtido a partir de moment.js
varUTCDateTime="Your date obtained from UTC";varISTleadTime=(moment.tz(UTCDateTime,"Africa/Abidjan")).tz("Asia/Kolkata").format('YYYY-MM-DD LT');
Eu criei uma função que converte todos os fusos horários em horário local.
Eu não usei getTimezoneOffset (), porque ele não retorna o valor de deslocamento adequado
Requisitos:
1. npm i moment-timezone
function utcToLocal(utcdateTime, tz){var zone = moment.tz(tz).format("Z")// Actual zone value e:g +5:30var zoneValue = zone.replace(/[^0-9: ]/g,"")// Zone value without + - charsvaroperator= zone && zone.split("")&& zone.split("")[0]==="-"?"-":"+"// operator for addition subtractionvar localDateTime
var hours = zoneValue.split(":")[0]var minutes = zoneValue.split(":")[1]if(operator==="-"){
localDateTime = moment(utcdateTime).subtract(hours,"hours").subtract(minutes,"minutes").format("YYYY-MM-DD HH:mm:ss")}elseif(operator){
localDateTime = moment(utcdateTime).add(hours,"hours").add(minutes,"minutes").format("YYYY-MM-DD HH:mm:ss")}else{
localDateTime ="Invalid Timezone Operator"}return localDateTime
}
utcToLocal("2019-11-14 07:15:37","Asia/Kolkata")//Returns "2019-11-14 12:45:37"
No meu caso, tive que encontrar a diferença de datas em segundos. A data era uma string de data UTC, então eu a converti em um objeto de data local. Isto é o que eu fiz:
function getUTC(str){var arr = str.split(/[- :]/);var utc =newDate(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 esta função para obter um objeto Data local a partir de uma string UTC, deve cuidar do horário de verão e trabalhará no IE, IPhone etc.
Dividimos a sequência (uma vez que a análise JS Date não é suportada em alguns navegadores). Obtemos diferença do UTC e subtraímos do horário UTC, o que nos dá a hora local. Como o deslocamento retornado é calculado com o horário de verão (corrija-me se eu estiver errado), ele ajustará esse tempo novamente na variável "utc". Finalmente, retorne o objeto de data.
Respostas:
Anexe 'UTC' à string antes de convertê-la em uma data em javascript:
fonte
!
Cuidado!
_ … a análise de seqüências de datas com o construtor Date (e Date.parse, eles são equivalentes) é fortemente desencorajada devido a diferenças e inconsistências do navegador… (o que provavelmente foi ainda mais verdadeiro em 2011)No meu ponto de vista, os servidores sempre devem retornar, no caso geral, uma data e hora no formato ISO 8601 padronizado .
Mais informações aqui:
Nesse caso, o servidor retornaria, o
'2011-06-29T16:52:48.000Z'
que alimentaria diretamente o objeto JS Date.O
localDate
horário será o local certo, o que, no meu caso, ocorreria duas horas depois (horário da Dinamarca).Você realmente não precisa fazer toda essa análise, o que apenas complica as coisas, desde que seja consistente com o formato esperado do servidor.
fonte
DateTime
objeto com o.toString("o")
qual retorna uma seqüência de caracteres formatada ISO-8601, como mostrado acima. msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx Em javascript énew Date().toISOString()
. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…Esta é uma solução universal:
Uso:
Exiba a data com base na configuração local do cliente:
fonte
Você deve obter o deslocamento (UTC) (em minutos) do cliente:
E então faça a adição ou subtração correspondente ao tempo que você obtém do servidor.
Espero que isto ajude.
fonte
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 conforme o fuso horário local, então usei o código abaixo em JavaScript.fonte
Coloque esta função em 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:
fonte
Isso funciona para mim:
fonte
Depois de tentar alguns outros postados aqui sem bons resultados, isso pareceu funcionar para mim:
E isso funciona no sentido oposto, da Data Local ao UTC:
fonte
new Date(+date + date.getTimezoneOffset() * 6e4)
. ;-)Adicione o fuso horário no final, neste caso 'UTC':
depois disso, use as famílias de funções toLocale () * para exibir a data na localidade correta
fonte
A resposta de Matt está ausente do fato de que o horário de verão pode ser diferente entre Date () e o horário que ele precisa converter - eis a minha solução:
E os resultados no depurador:
fonte
Use isso para converter UTC e hora local e vice-versa.
fonte
Esta é uma solução simplificada com base na resposta do Adorjan Princ:
Uso:
fonte
Caso você não se importe de usar
moment.js
e seu horário esteja no UTC, use o seguinte:se o seu tempo não estiver em utc, mas em qualquer outro local conhecido, use o seguinte:
se o seu horário já estiver no local, use o seguinte:
fonte
Para mim, o mais simples parecia usar
(eu pensei que a primeira linha poderia ser suficiente, mas há fusos horários que estão desativados em frações de horas)
fonte
new Date('date string')
e, em seguida, adicionei essas duas linhas e parece estar voltando com um horário baseado completamente no carimbo de data / hora UTC do servidor com ajustes feitos para corresponder à hora local do usuário. Eu precisa se preocupar com as fracções de-an-hour estranhas fusos horários também ... Não tenho certeza se ele mantém-se perfeitamente o tempo todo ...Uma sequência de datas JSON (serializada em C #) se parece com "2015-10-13T18: 58: 17".
Em angular, (seguindo Hulvej) faça um
localdate
filtro:Em seguida, exiba a hora local como:
fonte
Usando o
YYYY-MM-DD hh:mm:ss
formato:Para converter do
YYYY-MM-DD hh:mm:ss
formato, verifique se a sua data segue o formato ISO 8601 .Coisas importantes a serem observadas
T
, um espaço não funcionará em alguns navegadores+hh:mm
, o uso de uma sequência de caracteres para um fuso horário (por exemplo: 'UTC') não funcionará em muitos navegadores.+hh:mm
representa o deslocamento do fuso horário UTC.fonte
@Adorojan's
a 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 que eu vim com e está funcionando perfeitamente para mim:fonte
Para mim, isso funciona bem
fonte
Eu respondendo a isso se alguém quiser uma função que mostre a hora convertida em um elemento de identificação específico e aplique o formato de data string aaaa-mm-dd aqui date1 é string e ids é a identificação do elemento que a hora será exibida.
Eu sei que a resposta já foi aceita, mas eu cheguei aqui porque o google e resolvi obtendo inspiração da resposta aceita, então eu queria apenas compartilhá-la se alguém precisar.
fonte
Com base na resposta @digitalbath, aqui está uma pequena função para pegar o carimbo de data / hora UTC e exibir a hora local em um determinado elemento DOM (usando jQuery para esta última parte):
https://jsfiddle.net/moriz/6ktb4sv8/1/
fonte
Eu escrevi um pequeno script que leva uma época do UTC e o converte no fuso horário do sistema do cliente e o retorna no formato d / m / YH: i: s (como a função de data do PHP):
fonte
Você pode usar momentjs ,
moment(date).format()
sempre dará resultado na data local .Bônus , você pode formatar da maneira que desejar. Por exemplo.
Para mais detalhes, consulte o site Moment js
fonte
Você pode fazer isso usando o arquivo moment.js .
É simples, você acabou de mencionar o local do fuso horário.
Exemplo: para converter seu horário e data para fuso horário da Ásia / Calcutá, basta mencionar o nome do local do fuso horário obtido a partir de moment.js
fonte
Eu criei uma função que converte todos os fusos horários em horário local.
Eu não usei getTimezoneOffset (), porque ele não retorna o valor de deslocamento adequado
Requisitos:
fonte
No meu caso, tive que encontrar a diferença de datas em segundos. A data era uma string de data UTC, então eu a converti em um objeto de data local. Isto é o que eu fiz:
fonte
Para outras pessoas que visitam - use esta função para obter um objeto Data local a partir de uma string UTC, deve cuidar do horário de verão e trabalhará no IE, IPhone etc.
Dividimos a sequência (uma vez que a análise JS Date não é suportada em alguns navegadores). Obtemos diferença do UTC e subtraímos do horário UTC, o que nos dá a hora local. Como o deslocamento retornado é calculado com o horário de verão (corrija-me se eu estiver errado), ele ajustará esse tempo novamente na variável "utc". Finalmente, retorne o objeto de data.
fonte
Em Angular, usei a resposta de Ben desta maneira:
Edit: Angular 1.3.0 adicionado suporte UTC ao filtro de datas, ainda não o usei, mas deve ser mais fácil, aqui está o formato:
API de data angular 1.4.3
fonte