Converter data para outro fuso horário em JavaScript

Eu estou procurando uma function para converter data em um fuso horário para outro.

Precisa de dois parâmetros,

  • data (no formato “2012/04/10 10:10:30 +0000”)
  • fuso horário (“Asia / Jakarta”)

A string de fuso horário é descrita em http://en.wikipedia.org/wiki/Zone.tab

Existe uma maneira fácil de fazer isso?

Para usuários moment.js , agora você pode usar o fuso horário do momento . Usando isso, sua function seria algo como isto:

function toTimeZone(time, zone) { var format = 'YYYY/MM/DD HH:mm:ss ZZ'; return moment(time, format).tz(zone).format(format); } 

Roubado descaradamente de: http://www.techrepublic.com/article/convert-the-local-time-to-another-time-zone-with-this-javascript/6016329

 /** * function to calculate local time * in a different city * given the city's UTC offset */ function calcTime(city, offset) { // create Date object for current location var d = new Date(); // convert to msec // add local time zone offset // get UTC time in msec var utc = d.getTime() + (d.getTimezoneOffset() * 60000); // create new Date object for different city // using supplied offset var nd = new Date(utc + (3600000*offset)); // return time as a string return "The local time in " + city + " is " + nd.toLocaleString(); } 

esta function é útil para calcular o valor do fuso horário, fornecendo o nome de uma cidade / país e valor de deslocamento

A maioria dos navegadores de desktop (não móveis), exceto o Safari, suportam a function toLocaleString com argumentos, navegadores mais antigos geralmente ignoram os argumentos.

 new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' }) 

Ok, achei!

Estou usando timezone-js . este é o código:

 var dt = new timezoneJS.Date("2012/04/10 10:10:30 +0000", 'Europe/London'); dt.setTimezone("Asia/Jakarta"); console.debug(dt); //return formatted date-time in asia/jakarta 

Consegui !

Queria forçar a data mostrada = data do servidor, não importa as configurações locais (UTC).

Meu servidor é GMT-6 -> new Date (). GetTimezoneOffset () = 360.

 myTZO = 360; myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO))); alert(myNewDate); 

Se você só precisa converter fusos horários eu fiz o upload de uma versão simplificada do momento-tempo com apenas a funcionalidade mínima. Seus dados de ~ 1 KB +:

 S.loadData({ "zones": [ "Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6", "Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5", ], "links": [ "Europe/Paris|Europe/Madrid", ] }); let d = new Date(); console.log(S.tz(d, "Europe/Madrid").toLocaleString()); console.log(S.tz(d, "Australia/Sydney").toLocaleString()); 

Defina uma variável com ano, mês e dia separados por símbolos ‘-‘, mais um ‘T’ e a hora em HH: mm: ss padrão, seguidos por +01: 00 no final da string (no meu caso, o fuso horário é +1). Em seguida, use esta cadeia como o argumento para o construtor de data.

 //desired format: 2001-02-04T08:16:32+01:00 dateAndTime = year+"-"+month+"-"+day+"T"+hour+":"+minutes+":00+01:00"; var date = new Date(dateAndTime ); 

Você pode usar o método toLocaleString () para definir o fuso horário.

 new Date().toLocaleString('en-US', { timeZone: 'Indian/Christmas' }) 

Para a Índia, você pode usar “Indian / Christmas” e os seguintes são os fusos horários,

 "Antarctica/Davis", "Asia/Bangkok", "Asia/Hovd", "Asia/Jakarta", "Asia/Phnom_Penh", "Asia/Pontianak", "Asia/Saigon", "Asia/Vientiane", "Etc/GMT-7", "Indian/Christmas" 

Você também pode tentar isso para o fuso horário de data de conversão na Índia:

 var indianTimeZoneVal = new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'}); var indainDateObj = new Date(indianTimeZoneVal); indainDateObj.setHours(indainDateObj.getHours() + 5); indainDateObj.setMinutes(indainDateObj.getMinutes() + 30); console.log(indainDateObj); 

Devo observar que estou restrito em relação a quais bibliotecas externas posso usar. moment.js e timezone-js não eram uma opção para mim.

O object de data js que tenho está em UTC. Eu precisava obter a data e hora a partir desta data em um fuso horário específico (‘America / Chicago’ no meu caso).

  var currentUtcTime = new Date(); // This is in UTC // Converts the UTC time to a locale specific format, including adjusting for timezone. var currentDateTimeCentralTimeZone = new Date(currentUtcTime.toLocaleString('en-US', { timeZone: 'America/Chicago' })); console.log('currentUtcTime: ' + currentUtcTime.toLocaleDateString()); console.log('currentUtcTime Hour: ' + currentUtcTime.getHours()); console.log('currentUtcTime Minute: ' + currentUtcTime.getMinutes()); console.log('currentDateTimeCentralTimeZone: ' + currentDateTimeCentralTimeZone.toLocaleDateString()); console.log('currentDateTimeCentralTimeZone Hour: ' + currentDateTimeCentralTimeZone.getHours()); console.log('currentDateTimeCentralTimeZone Minute: ' + currentDateTimeCentralTimeZone.getMinutes()); 

A UTC está atualmente 6 horas à frente de ‘America / Chicago’. A saída é:

 currentUtcTime: 11/25/2016 currentUtcTime Hour: 16 currentUtcTime Minute: 15 currentDateTimeCentralTimeZone: 11/25/2016 currentDateTimeCentralTimeZone Hour: 10 currentDateTimeCentralTimeZone Minute: 15 

Pessoas familiarizadas com o pacote java.time java 8, ou joda-time provavelmente vão adorar o novo garoto no bloco: a biblioteca js-joda .

Instalar

 npm install js-joda js-joda-timezone --save 

Exemplo

    

Na verdadeira natureza java, é bem detalhado lol. Mas, sendo uma biblioteca java portada, especialmente considerando-se que eles suportam 1800 casos de teste, ela provavelmente também funciona de maneira soberba e precisa.

A manipulação do crono é difícil. É por isso que muitas outras bibliotecas têm bugs nos casos de borda. Moment.js parece ter fusos horários certos, mas os outros js libs que eu vi, incluindo timezone-js , não parecem confiáveis.

Se o formato não for muito importante e você não quiser importar alguma biblioteca grande, basta usar o Intl.DateTimeFormat para converter objects Date em fusos horários diferentes.

 const options = { year: '2-digit', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', timeZone: 'Asia/Jakarta', timeZoneName: 'short' }; const formater = new Intl.DateTimeFormat('sv-SE', options) const date = new Date("2012/04/10 10:10:30 +0000") console.log(formater.format(date)) 

Eu estava com problemas para usar o Moment Timezone . Estou adicionando esta resposta apenas se alguém mais tiver o mesmo problema. Então eu tenho uma string de data 2018-06-14 13:51:00 vindo da minha API . Eu sei que isso é armazenado em UTC mas a string não fala por si.

Deixo o fuso horário saber, de que fuso horário é essa data fazendo:

 let uTCDatetime = momentTz.tz("2018-06-14 13:51:00", "UTC").format(); // If your datetime is from any other timezone then add that instead of "UTC" // this actually makes the date as : 2018-06-14T13:51:00Z 

Agora eu gostaria de convertê-lo para um fuso horário específico, fazendo:

 let dateInMyTimeZone = momentTz.tz(uTCDatetime, "Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss"); // now this results into: 2018-06-14 19:21:00, which is the corresponding date in my timezone. 

Eu não sei um método fácil para converter um object de data para qualquer fuso horário, mas se você quiser convertê-lo para o fuso horário local, você pode apenas convertê-lo com Date.prototype.getTime() para o número correspondente de milissegundos e de volta novamente.

 date = new Date('2016-05-24T13:07:20'); date = new Date(date.getTime()); 

Por exemplo, date.getHours() agora retornará 15 vez de 13 se você for, como eu, na Áustria (e no verão).

Eu li que as várias funções de data e hora podem exibir um comportamento não padrão em alguns navegadores, então teste isso primeiro. Posso confirmar que funciona no Chrome.

existe um módulo npm chamado ‘timezones.json’ que você pode usar para isso; consiste basicamente em um arquivo json com objects contendo informações sobre horário de verão e offset, ….

para asia / jakarta seria capaz de retornar este object:

 { "value": "SE Asia Standard Time", "abbr": "SAST", "offset": 7, "isdst": false, "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta", "utc": [ "Antarctica/Davis", "Asia/Bangkok", "Asia/Hovd", "Asia/Jakarta", "Asia/Phnom_Penh", "Asia/Pontianak", "Asia/Saigon", "Asia/Vientiane", "Etc/GMT-7", "Indian/Christmas" ] } 

Você pode encontrá-lo aqui:

https://github.com/dmfilipenko/timezones.json

https://www.npmjs.com/package/timezones.json

espero que seja útil

Time Zone Offset para seu fuso horário atual

 date +%s -d '1 Jan 1970' 

Para o fuso horário GMT + 10 (Austrália), retornou -36000

Eu fiz recentemente isso em Typescript:

 // fromTimezone example : Europe/Paris, toTimezone example: Europe/London private calcTime( fromTimezone: string, toTimezone: string, dateFromTimezone: Date ): Date { const dateToGetOffset = new Date( 2018, 5, 1, 12 ); const fromTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: fromTimezone, hour12: false } ); const toTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: toTimezone, hour12: false } ); const fromTimeHours: number = parseInt( fromTimeString.substr( 0, 2 ), 10 ); const toTimeHours: number = parseInt( toTimeString.substr( 0, 2 ), 10 ); const offset: number = fromTimeHours - toTimeHours; // convert to msec // add local time zone offset // get UTC time in msec const dateFromTimezoneUTC = Date.UTC( dateFromTimezone.getUTCFullYear(), dateFromTimezone.getUTCMonth(), dateFromTimezone.getUTCDate(), dateFromTimezone.getUTCHours(), dateFromTimezone.getUTCMinutes(), dateFromTimezone.getUTCSeconds(), ); // create new Date object for different city // using supplied offset const dateUTC = new Date( dateFromTimezoneUTC + ( 3600000 * offset ) ); // return time as a string return dateUTC; } 

Eu uso o formato “en-UK” porque é simples. Poderia ter sido “en-US” ou o que quer que funcione.

Se o primeiro argumento for seu fuso horário local e seconde for seu fuso horário de destino, ele retornará um object Date com o deslocamento correto.