Converter data para outro fuso horário em JavaScript

336

Estou procurando uma função para converter a data em um fuso horário para outro.

Precisa de dois parâmetros,

  • data (no formato "2012/04/10 10:10:30 +0000")
  • sequência de fuso horário ("Ásia / Jacarta")

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

Existe uma maneira fácil de fazer isso?

Rizky Ramadhan
fonte
1
Encontre o deslocamento UTC de uma determinada cidade. stackoverflow.com/questions/3002910/…
Brandon Boone
3
Quero calcular não apenas o deslocamento UTC, mas também o horário de verão. Então a hora retornará corretamente.
Rizky Ramadhan 10/04
Verifique este também stackoverflow.com/questions/16084313/…
Amol M Kulkarni
Desativado o fuso horário usando o comando unix date: date +% s -d '1 Jan 1970'
anthony

Respostas:

192

var aestTime = new Date().toLocaleString("en-US", {timeZone: "Australia/Brisbane"});
console.log('AEST time: '+ (new Date(aestTime)).toISOString())

var asiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Shanghai"});
console.log('Asia time: '+ (new Date(asiaTime)).toISOString())

var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
console.log('USA time: '+ (new Date(usaTime)).toISOString())

var indiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Kolkata"});
console.log('India time: '+ (new Date(indiaTime)).toISOString())

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

Udhaya
fonte
1
Eu mudei a resposta para isso, pois esse é o método correto e padrão sem usar nenhuma biblioteca.
Rizky Ramadhan 18/01/19
5
A documentação do MDN diz claramente que o único fuso horário necessário para ser reconhecido em todas as implementações é o UTC. ( stackoverflow.com/questions/10087819/… ) Clicar no botão [Executar código snippet] no IE11 produz um erro.
Vivian River
1
Se alguém olhar para a implementação que funciona para todos os navegador agora mesmo, eles podem tentar quaisquer respostas abaixo com a sua própria cons ...
Rizky Ramadhan
14
Esta resposta mostra a passagem correta de um fuso horário para toLocaleString, mas mostra incorretamente a passagem dessa sequência de volta para o Dateconstrutor. Isso está pedindo problemas. O analisador de cadeia de datas não é necessário para aceitar formatos específicos de código de idioma e a entrada seria tratada como se estivesse no fuso horário local. Não faça isso. Basta usar a saída de string da primeira toLocalStringchamada.
Matt Johnson-Pint
4
@MattJohnson então você não pode usar GetHour () ou tais métodos
Ali Padida
131

Para usuários moment.js , agora você pode usar o fuso horário . Ao usá-lo, sua função ficaria assim:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}
Brian Di Palma
fonte
3
Eu não tinha certeza de como adicionar novos fusos horários, os documentos não me ajudaram. Sou apenas um programador, não um especialista em tempo!
Parziphal
8
O problema aqui é que isso não retorna um novo objeto Date, mas retorna uma string. Se é isso que você quer, isso é bom, é claro.
nickdnk
2
Não é "retornar momento (hora) .tz (zona) .format (formato);" ? O que você forneceu no seu código tem o erro "Data inválida".
Tarek
1
Não é possível carregar o Moment.js no navegador. Muito triste :(
Daniil Shevelev
4
Se você não estiver satisfeito em enviar 180K ao navegador com uma cópia do banco de dados tz e puder viver com a degradação do fuso horário atual em navegadores antigos, tente a resposta do @ lambinator usando Date.prototype.toLocaleString.
Peter V. Mørch
92

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

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

Valli69
fonte
4
legal .... mas acho que ele quer que o deslocamento seja procurado por ele com base no passado na cidade.
Brandon Boone
117
Isso não leva em consideração as alterações do horário de verão.
Robotbugs
12
não responde à pergunta, mas responde à minha (+1)
Reign
Aquele '3600000' literalmente me matou! Na entrada, tz deve ser dado em horas! E, deve ser subtraído. Portanto, se você passar: var d = new Date calcTime ('', d.getTimezoneOffset () / 60); Deve devolver o mesmo tempo.
Praveen 26/11
1
Essa resposta está seriamente desatualizada e deve ser removida, principalmente a parte usando toLocaleString , que provavelmente reportará o fuso horário do host quando ele tiver sido alterado para um fuso horário diferente. Existem maneiras muito melhores de criar manualmente carimbos de data e hora para diferentes compensações.
RobG 27/09
89

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

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
lambinador
fonte
4
Falha no Firefox e Edge :(
Šime Vidas
10
Como isso falha muito no FF e no IE11 +, outra solução precisa ser encontrada.
Jdavid.net 17/09/2015
2
O Edge e o Chrome gostaram :)
Suhail Mumtaz Awan /
6
Ele funcionava agora no Chrome v59 e no Firefox desktop v54 e no Chome no Android v59 e no Safari 10 no iOS 10.3. Não funcionou no IE10. A descrição do MDN de Date.prototype.toLocaleString () possui uma toLocaleStringSupportsLocales()implementação que permite verificar de forma confiável o suporte.
Peter V. Mørch
1
Testado com sucesso no node.js v8.7.0
Heinrich Ulbricht
56

Ok, encontrei!

Estou usando o fuso horário-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
Rizky Ramadhan
fonte
90
Eu tenho que votar contra isso, o fuso horário-js não suporta o horário de verão e não anuncia isso em seu leia-me, o que o torna uma péssima dica para quem procura isso. Consulte: github.com/mde/timezone-js/issues/51 e vários outros problemas que foram arquivados e que parecem não ter sido corrigidos.
@ nus sim, mas realmente não há uma solução para o gerenciamento de fuso horário / data do lado do cliente ... jquery ui datepicker está me deixando louco por causa disso. Cheers
Lucas
2
@Marabunta, parece que de momento fuso horário (resposta por Brian De Palma) suporta DST github.com/moment/moment-timezone/issues/21
welldan97
2
Não use o TimezoneJS, ele está relacionado às alterações no horário de verão.
matf
17

Se você não deseja importar uma grande biblioteca, basta usar o Intl.DateTimeFormat para converter objetos Date em fusos horários diferentes.

// Specifying timeZone is what causes the conversion, the rest is just formatting
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 startingDate = new Date("2012/04/10 10:10:30 +0000")

const dateInNewTimezone = formater.format(startingDate) 
console.log(dateInNewTimezone) // 12-04-10 17:10:30 GMT+7

Compensações, horário de verão e alterações no passado serão resolvidas por você.

Sem fim
fonte
O IE10 + não oferece suporte à API internacional para fusos horários. moment.github.io/luxon/docs/manual/matrix.html
Chloe
Esta é realmente a melhor resposta. toLocaleStringpossui implementação inconsistente e isso funciona a partir do IE11 em diante.
Dlsso 9/05/19
FYI: Na verdade, isso não funciona no IE11, pelo menos no Windows 8.1. Ao tentar criar o formatterobjeto, você obtém: `` O valor da opção 'Ásia / Jacarta' para 'timeZone' está fora do intervalo válido. Esperado: ['UTC'] `` `
veddermatic
existe uma maneira de converter o resultado final do formatador em um objeto Date novamente?
mding5692
10

Entendi !

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);
Cedric Simon
fonte
2
Embora mostre a hora correta, as informações do fuso horário de myOldDateObj são mantidas. Então, na verdade, é a hora errada (quando você toma um tempo como uma instância no tempo e não a hora no relógio).
9116 Gabn88
@ gabn88: Você não poderá alterar a hora do servidor usando Javascript ... Para corrigir a hora do servidor, faça isso no nível do sistema operacional.
Cedric Simon
2
Não preciso fixar a hora do servidor;) A hora do servidor é sempre UTC para mim. Mas eu tenho uma organização diferente em fusos horários diferentes. E seus dispositivos devem sempre mostrar o horário em que sua organização está estacionada, onde quer que estejam.
gabn88
Temos um problema semelhante de mostrar datas sempre X fuso horário. Tentamos enviar todas as datas no formato de string do servidor e no navegador apenas as tratamos como datas do fuso horário local.
Venkateswara Rao
5

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

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

Na Índia, você pode usar "Indiano / Natal" e os seguintes fusos horários são:

"Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
Codemaker
fonte
Você não está definindo o fuso horário, mas produzindo uma string com o tempo expresso nesse fuso horário. A data permanece a mesma.
Gerard ONeill
A toLocaleStringsolução foi dada há 4 anos .
Dan Dascalescu 7/11/19
4

Se você precisar converter apenas fusos horários, carreguei uma versão simplificada do fuso horário, com apenas a funcionalidade mínima. Seus ~ 1 KB + dados:

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());
Santiago Corredoira
fonte
2

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

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

var date = new Date(dateAndTime );
Nather Webber
fonte
2

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

O objeto js date que eu tenho está no UTC. Eu precisava obter a data E a hora dessa 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());

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
procurando27
fonte
11
new Date();retornar fuso horário local, não UTC
Mirko
1
dos documentos:If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
Mirko
Hmm. Meio confuso. Isso não altera o fuso horário em uma data; em vez disso, cria uma nova data com o horário alterado. Seria muito mais claro usar uma expressão regular para extrair os valores que você deseja da string criada a partir da chamada toLocaleString.
Gerard ONeill
2

Aqui está o meu código, está funcionando perfeitamente, você pode tentar com a demonstração abaixo:

$(document).ready(function() {
   //EST
setInterval( function() {
var estTime = new Date();
 var currentDateTimeCentralTimeZone = new Date(estTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));
var seconds = currentDateTimeCentralTimeZone.getSeconds();
var minutes = currentDateTimeCentralTimeZone.getMinutes();
var hours =  currentDateTimeCentralTimeZone.getHours()+1;//new Date().getHours();
 var am_pm = currentDateTimeCentralTimeZone.getHours() >= 12 ? "PM" : "AM";

if (hours < 10){
     hours = "0" + hours;
}

if (minutes < 10){
     minutes = "0" + minutes;
}
if (seconds < 10){
     seconds = "0" + seconds;
}
    var mid='PM';
    if(hours==0){ //At 00 hours we need to show 12 am
    hours=12;
    }
    else if(hours>12)
    {
    hours=hours%12;
    mid='AM';
    }
    var x3 = hours+':'+minutes+':'+seconds +' '+am_pm
// Add a leading zero to seconds value
$("#sec").html(x3);
},1000);


});
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<p class="date_time"><strong id="sec"></strong></p>
</body>
</html>

Sahil Kapoor
fonte
Bem-vindo ao StackOverflow! Você pode fornecer mais informações, como o funcionamento desse código e o que ele faz? Como ele resolve o problema?
DarkSuniuM
Meu código acima é atualizar o fuso horário para o fuso horário de outros países.
Sahil Kapoor
Você precisa colocar o HTML no seu arquivo html e o código jquery fornecido acima deve estar no rodapé. Ele funcionará para você de acordo com ('en-US', {timeZone: 'America / Chicago'}). Você precisa atualizar esses dois valores, se desejar o fuso horário de outros países. Obrigado
Sahil Kapoor
Não espera. Eu apenas votei isso sem olhar com cuidado. Por que você está adicionando 1 a currentDateTimeCentralTimeZone.getHours()? Sem que ele iria trabalhar e é o mesmo que das seeking27 resposta stackoverflow.com/a/40809160/1404185
chetstone
1

Você pode tentar isso também para converter o fuso horário da data em Í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);
Rahul Mankar
fonte
1
após o segundo passo em si, recebo o tempo na Índia ... então, por que você ainda está adicionando 5 e 1 / 2hrs a ele?
user3833732
Ao usar esse método, obtenho o seguinte aqui na Noruega quando eu console o log com o Chrome: Original: Qui Sep 27 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Modificado: quinta-feira 27 setembro 2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid). "Sentraleuropeisk sommertid" significa horário de verão da Europa Central. Não tenho certeza se isso funcionaria quando você precisar do horário de verão para a Índia ou vice-versa quando estiver na Índia e precisar do horário de verão para a Europa e assim por diante.
Kebman # 27/18
O uso de setHours () como esse não leva em conta as transições de dia, mês, ano, por exemplo, 3:30 da manhã na New Dell no dia 8, e 23 no dia 7, em Londres. Em seguida, considere o final do mês, ano e dias bissextos. Faça com que Date faça isso <pre> deixe local_time = new Date (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor - 60 * 60 * 1000); deixe date_str = local_time.toISOString (). slice (0, 10); deixe time_str = local_time.toISOString (). slice (11, -1); deixe timezone_str = std_timezone.timezone_str; </pre>
Lincoln Randall McFarland
1

Tendo olhado em volta, incluindo links desta página, encontrei este ótimo artigo, usando o fuso horário do momento:

https://www.webniraj.com/2016/11/23/javascript-using-moment-js-to-display-dates-times-in-users-timezone/

Para resumir:

Obter o fuso horário do usuário

var tz = moment.tz.guess();
console.info('Timezone: ' + tz);

Retorna por exemplo: Fuso Horário: Europe / London

Definir o fuso horário do usuário padrão

moment.tz.setDefault(tz);

Definir fuso horário personalizado

moment.tz.setDefault('America/Los_Angeles');

Converter data / hora no fuso horário local, assumindo que a data / hora original está no UTC

moment.utc('2016-12-25 07:00').tz(tz).format('ddd, Do MMMM YYYY, h:mma');

Regresso: Dom, 25 de dezembro de 2016, 07:00

Converter data / hora em LA Time

moment.utc('2016-12-25 07:00').tz('America/Los_Angeles').format('ddd, Do MMMM YYYY, h:mma');

Volta: Sábado, 24 de dezembro de 2016, 23:00

Converter do horário de Los Angeles para Londres

moment.tz('2016-12-25 07:00', 'America/Los_Angeles').tz('Europe/London').format( 'ddd, Do MMMM YYYY, h:mma' );

Regresso: Dom, 25 de dezembro de 2016, 15:00

omarjebari
fonte
1

Você também pode usar https://www.npmjs.com/package/ctoc_timezone

Tem uma implementação muito simples e personalização de formato.

Alterando o formato no toTimeZone:

CtoC.toTimeZone(new Date(),"EST","Do MMM YYYY hh:mm:ss #{EST}");

Resultado :

28th Feb 2013 19:00:00 EST

Você pode explorar várias funcionalidades no documento.

Sandeep Chowdary
fonte
0

existe um módulo npm chamado 'timezones.json' que você pode usar para isso; consiste basicamente em um arquivo json com objetos que contêm informações sobre horário de verão e deslocamento, ....

para asia / jakarta, seria possível retornar este objeto:

{
  "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

Kevin
fonte
0

Pessoas familiarizadas com o java.timepacote java 8 ou joda-timeprovavelmente adorarão o novo garoto do ramo: o js-joda biblioteca .

Instalar

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

Exemplo

<script src="node_modules/js-joda/dist/js-joda.js"></script>
<script src="node_modules/js-joda-timezone/dist/js-joda-timezone.js"></script>
<script>
var dateStr = '2012/04/10 10:10:30 +0000';
JSJoda.use(JSJodaTimezone);
var j = JSJoda;
// https://js-joda.github.io/js-joda/esdoc/class/src/format/DateTimeFormatter.js~DateTimeFormatter.html#static-method-of-pattern
var zonedDateTime = j.ZonedDateTime.parse(dateStr, j.DateTimeFormatter.ofPattern('yyyy/MM/dd HH:mm:ss xx'));
var adjustedZonedDateTime = zonedDateTime.withZoneSameInstant(j.ZoneId.of('America/New_York'));
console.log(zonedDateTime.toString(), '=>', adjustedZonedDateTime.toString());
// 2012-04-10T10:10:30Z => 2012-04-10T06:10:30-04:00[America/New_York]
</script>

Na verdadeira natureza do java, é bastante detalhado lol. Mas, sendo uma biblioteca java portada, especialmente considerando que eles portaram casos de teste de 1800, provavelmente também funciona com precisão excelente.

A manipulação do cronógrafo é difícil. É por isso que muitas outras bibliotecas estão com problemas em casos extremos. O Moment.js parece acertar os fusos horários, mas as outras bibliotecas js que eu já vi, inclusive timezone-js, não parecem confiáveis.

bode
fonte
0

Recentemente fiz isso no 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 o fuso horário local e a segunda for o fuso horário de destino, ele retornará um objeto Date com o deslocamento correto.

Alexandre Liscia
fonte
0

Eu estava tendo problemas para usar o fuso horário do momento . Estou adicionando esta resposta apenas se outra pessoa enfrentar o mesmo problema. Então, eu tenho uma string de data 2018-06-14 13:51:00vindo do meu API. Eu sei que isso é armazenado, UTCmas a string não fala por si.

Avisei o fuso horário do momento, de que fuso horário está essa data:

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.
Ashish Ranjan
fonte
0

Basta definir o fuso horário do seu país desejado e você pode mostrar facilmente em html, a atualização usando a função SetInteval () após cada minuto. A função formatAMPM () gerencia o formato de 12 horas e a exibição da hora AM / PM.

$(document).ready(function(){
        var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
        pakTime = new Date(pakTime);

        var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
        libyaTime = new Date(libyaTime);



         document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
         document.getElementById("ly").innerHTML = "LY   " +formatAMPM(libyaTime);

        setInterval(function(today) {
            var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
            pakTime = new Date(pakTime);

            var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
            libyaTime = new Date(libyaTime);


           document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
           document.getElementById("ly").innerHTML = "LY  " +formatAMPM(libyaTime);

        },10000);

         function formatAMPM(date) {
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var ampm = hours >= 12 ? 'pm' : 'am';
            hours = hours % 12;
            hours = hours ? hours : 12; // the hour '0' should be '12'
            minutes = minutes < 10 ? '0'+minutes : minutes;
            var strTime = hours + ':' + minutes + ' ' + ampm;
            return strTime;
        }


    });
Muhammad Azeem
fonte
-1

Não conheço um método fácil de converter um objeto de data para qualquer fuso horário, mas se você quiser convertê-lo no fuso horário local, basta convertê-lo Date.prototype.getTime()no número correspondente de milissegundos e voltar novamente.

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

Por exemplo, date.getHours()agora você retornará em 15vez de 13se você estiver, como eu, na Áustria (e é 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.

黄 雨伞
fonte
1
Por que isso foi rejeitado? Essa é de longe a melhor e mais fácil maneira de fazer isso. A maioria das respostas acima não ter tempo de verão / inverno em consideração
MortenSickel
Qual é o objetivo da segunda linha? O construtor Date já assume seu fuso horário local. Ambas as linhas retornam uma data no fuso horário do navegador local e não respondem à pergunta sobre como converter para outro fuso horário com o horário de verão.
Chloe #
-1

Deslocamento do fuso horário para o seu fuso horário atual

date +%s -d '1 Jan 1970'

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

anthony
fonte
-6

trocador de horas manual rápido e sujo e retorno:

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()
Jerry
fonte
muito sujo (e muito bagunçado)
Maxwell sc