Convertir fecha a otra zona horaria en JavaScript

336

Estoy buscando una función para convertir la fecha en una zona horaria a otra.

Necesita dos parámetros,

  • fecha (en formato "2012/04/10 10:10:30 +0000")
  • cadena de zona horaria ("Asia / Yakarta")

La cadena de zona horaria se describe en http://en.wikipedia.org/wiki/Zone.tab

¿Hay una forma fácil de hacer esto?

Rizky Ramadhan
fuente
1
Encuentra el desplazamiento UTC de una ciudad determinada. stackoverflow.com/questions/3002910/…
Brandon Boone
3
Quiero calcular no solo el desplazamiento UTC sino también el horario de verano / horario de verano. Entonces el tiempo volverá correctamente.
Rizky Ramadhan
Comprueba este también stackoverflow.com/questions/16084313/…
Amol M Kulkarni
Fuera del conjunto de su zona horaria utilizando el comando de fecha unix: date +% s -d '1 ene 1970'
anthony

Respuestas:

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
fuente
1
Cambié la respuesta a esto, ya que este es el método correcto y estándar sin usar ninguna biblioteca.
Rizky Ramadhan
55
La documentación de MDN dice claramente que la única zona horaria que debe reconocerse en todas las implementaciones es UTC. ( stackoverflow.com/questions/10087819/… ) Al hacer clic en el botón [Ejecutar fragmento de código] en IE11 se produce un error.
Vivian River el
1
Si alguien que busca una implementación que funcione para todos los navegadores en este momento, puede probar las respuestas a continuación con sus propias desventajas ...
Rizky Ramadhan
14
Esta respuesta muestra pasar correctamente una zona horaria a toLocaleString, pero luego muestra muy incorrectamente pasar esa cadena de nuevo al Dateconstructor. Eso es pedir problemas. No se requiere que el analizador de cadenas de fecha acepte formatos específicos de la configuración regional, y la entrada se tratará como si estuviera en la zona horaria local. No hagas eso. Simplemente use la salida de cadena de la primera toLocalStringllamada.
Matt Johnson-Pint
44
@MattJohnson, entonces no puedes usar getHour () o tales métodos
Ali Padida
131

Para los usuarios de moment.js , ahora puede usar moment-timezone . Al usarlo, su función se vería así:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}
Brian Di Palma
fuente
3
No estaba seguro de cómo agregar nuevas zonas horarias, los documentos no me ayudaron. ¡Soy solo un programador, no un experto en tiempo!
Parziphal
8
El problema aquí es que esto no devuelve un nuevo objeto Date, devuelve una cadena. Si eso es lo que quieres, está bien, por supuesto.
nickdnk
2
¿No es "momento de retorno (tiempo) .tz (zona) .formato (formato);" ? El que usted dio en su código me tiene el error "Fecha inválida".
Tarek
1
No es posible cargar Moment.js en el navegador. Muy triste :(
Daniil Shevelev
44
Si no está contento de enviar 180K al navegador con una copia de la base de datos tz y puede vivir con degradación a la zona horaria actual en navegadores más antiguos, pruebe la respuesta de @ lambinator usando Date.prototype.toLocaleString.
Peter V. Mørch
92

Robado 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 función es útil para calcular el valor de zona horaria proporcionando el nombre de una ciudad / país y el valor de compensación

Valli69
fuente
44
agradable ... pero creo que quiere que se le busque el desplazamiento basándose en lo que pasó en la ciudad.
Brandon Boone
117
Esto no tiene en cuenta los cambios de horario de verano.
Robotbugs
12
no responde la pregunta pero responde la mía (+1)
Reign.85
¡Ese '3600000' literalmente me mató! En la entrada, ¡tz debe administrarse en horas! Y, debe ser restado. Entonces, si pasa: var d = new Date calcTime ('', d.getTimezoneOffset () / 60); Debería devolver el mismo tiempo.
Praveen
1
Esta respuesta está muy desactualizada y debe eliminarse, particularmente la parte que usa toLocaleString , que probablemente informará la zona horaria del host cuando se haya cambiado a una zona horaria diferente. Hay formas mucho mejores de crear manualmente marcas de tiempo para diferentes compensaciones.
RobG
89

La mayoría de los navegadores de escritorio (no móviles) excepto Safari admiten la función toLocaleString con argumentos, los navegadores más antiguos generalmente ignoran los argumentos.

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
lambinator
fuente
44
Falla en Firefox y Edge :(
Šime Vidas
10
Debido a que esto falla con dificultad en FF e IE11 +, se necesita encontrar otra solución.
jdavid.net
2
A Edge y Chrome les gustó :)
Suhail Mumtaz Awan
66
Funcionó ahora en Chrome v59 y Firefox Desktop v54 y Chome en Android v59 y Safari 10 en iOS 10.3. No funcionó en IE10. La descripción de MDN de Date.prototype.toLocaleString () tiene una toLocaleStringSupportsLocales()implementación que le permite verificar de manera confiable el soporte.
Peter V. Mørch
1
Probado con éxito en node.js v8.7.0
Heinrich Ulbricht
56

Ok, lo encontré!

Estoy usando timezone-js . Este es el 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
fuente
90
Tengo que votar en contra de esto, timezone-js no admite DST y no anuncia eso en su archivo Léame, lo que lo convierte en un mal consejo para las personas que buscan esto. Consulte: github.com/mde/timezone-js/issues/51 y una serie de otros problemas que se han presentado y que no parecen solucionarse.
@nus sí, pero realmente no hay una solución para la gestión de zona horaria / fecha del lado del cliente ... jquery ui datepicker me ha vuelto loco por esto. aplausos
Lucas
2
@Marabunta, parece que zona horaria (respuesta de Brian Di Palma) admite DST github.com/moment/moment-timezone/issues/21
welldan97
2
No use TimezoneJS, está molesto por los cambios de horario de verano.
matf
17

Si no desea importar una gran biblioteca, puede usar Intl.DateTimeFormat para convertir objetos Date a diferentes zonas horarias.

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

Las compensaciones, el horario de verano y los cambios en el pasado se encargarán de usted.

Sin fin
fuente
IE10 + no admite API Intl para zonas horarias. moment.github.io/luxon/docs/manual/matrix.html
Chloe
Esta es realmente la mejor respuesta. toLocaleStringtiene una implementación inconsistente, y esto funciona desde IE11 en adelante.
dlsso
FYI: Esto en realidad no funciona en IE11, al menos en Windows 8.1. Cuando intentas crear el formatterobjeto, obtienes: `` El valor de la opción 'Asia / Yakarta' para 'timeZone' está fuera del rango válido. Esperado: ['UTC'] `` `
veddermatic
¿Hay alguna manera de convertir el resultado final del formateador en un objeto Date nuevamente?
mding5692
10

Entendido !

Quería forzar la fecha mostrada = fecha del servidor, no importa la configuración local (UTC).

Mi servidor es GMT-6 -> nueva Fecha (). GetTimezoneOffset () = 360.

myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);
Cedric Simon
fuente
2
Aunque muestra la hora ingenua correcta, la información de zona horaria de myOldDateObj se mantiene. Entonces, en realidad es el momento equivocado (cuando tomas el tiempo como una instancia en el tiempo y no el tiempo en un reloj).
gabn88
@ gabn88: No podrá cambiar la hora del servidor usando Javascript ... Para arreglar la hora del servidor, hágalo a nivel del sistema operativo.
Cedric Simon
2
No necesito arreglar la hora del servidor;) La hora del servidor siempre es UTC para mí. Pero tengo una organización diferente en diferentes zonas horarias. Y sus dispositivos siempre deben mostrar la hora de dónde está estacionada su organización, donde sea que estén.
gabn88
Tenemos un problema similar al mostrar las fechas siempre X zona horaria. Intentamos enviar todas las fechas en formato de cadena desde el servidor y en el navegador las tratamos como fechas de zona horaria local.
Venkateswara Rao
5

Puede usar el método toLocaleString () para configurar la zona horaria.

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

Para India, puede usar "India / Navidad" y las siguientes son varias zonas horarias,

"Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
Codemaker
fuente
No está configurando la zona horaria, sino que produce una cadena con el tiempo expresado en esa zona horaria. La fecha permanece igual.
Gerard ONeill
La toLocaleStringsolución ya se dio hace 4 años .
Dan Dascalescu el
4

Si solo necesita convertir zonas horarias, he subido una versión reducida de zona horaria con solo la mínima funcionalidad. Sus ~ 1KB + datos:

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
fuente
2

Establezca una variable con año, mes y día separados con símbolos '-', más una 'T' y la hora en HH: mm: patrón ss, seguido de +01: 00 al final de la cadena (en mi caso, el la zona horaria es +1). Luego use esta cadena como argumento para el constructor de la fecha.

//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
fuente
2

Debo señalar que estoy restringido con respecto a las bibliotecas externas que puedo usar. moment.js y timezone-js NO fueron una opción para mí.

El objeto de fecha js que tengo está en UTC. Necesitaba obtener la fecha Y la hora de esta fecha en una zona horaria específica ('América / Chicago' en mi 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 es actualmente 6 horas por delante de 'América / Chicago'. Salida es:

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

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15
buscando27
fuente
11
new Date();regresar zona horaria local, no UTC
Mirko
1
de los 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 Un poco confuso Esto no cambia la zona horaria en una fecha; más bien crea una nueva fecha con las horas cambiadas. Sería mucho más claro usar una expresión regular para extraer los valores que desea de la cadena que se crea a partir de la llamada toLocaleString.
Gerard ONeill
2

Aquí está mi código, está funcionando perfectamente, puedes probar con la siguiente demostración:

$(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
fuente
¡Bienvenido a StackOverflow! ¿Puede proporcionar más información como cómo funciona este código y qué hace? ¿Cómo soluciona el problema?
DarkSuniuM
Mi código anterior es para actualizar su zona horaria a la zona horaria de otros países.
Sahil Kapoor
Debe poner el HTML en su archivo html y el código jquery anterior debe estar en el pie de página. Funcionará para usted según ('en-US', {timeZone: 'America / Chicago'}) necesita actualizar estos dos valores, si desea la zona horaria de otros países Gracias
Sahil Kapoor
No, espera. Acabo de votar esto sin mirarlo detenidamente. ¿Por qué estás agregando 1 a currentDateTimeCentralTimeZone.getHours()? Sin eso, funcionaría y es lo mismo que buscar la respuesta de 27 stackoverflow.com/a/40809160/1404185
chetstone
1

Puede probar esto también para convertir la zona horaria de fecha a India:

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
fuente
1
después del segundo paso en sí, obtengo el tiempo en la India ... entonces, ¿por qué sigues agregando 5 y 1/2 horas?
user3833732
Cuando uso ese método, obtengo lo siguiente aquí en Noruega cuando registro la consola con Chrome: Original: jue 27 sep 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Modificado: jue 27 sep 2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid). "Sentraleuropeisk sommertid" significa el horario de verano de Europa Central. No estoy seguro de si eso funcionaría cuando necesite tiempo de verano para India, o viceversa cuando esté en India y necesite horario de verano para Europa, y así sucesivamente.
Kebman
El uso de setHours () como este no tiene en cuenta las transiciones de día, mes y año, por ejemplo, las 3:30 a.m.en New Dell el día 8 son las 11 p.m. el día 7 en Londres. Luego considere el final del mes, año y días bisiestos. Haga que Date haga las matemáticas <pre> let local_time = new Date (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor - 60 * 60 * 1000); let date_str = local_time.toISOString (). slice (0, 10); let time_str = local_time.toISOString (). slice (11, -1); let timezone_str = std_timezone.timezone_str; </pre>
Lincoln Randall McFarland el
1

Después de mirar mucho, incluidos los enlaces de esta página, encontré este excelente artículo, usando la zona horaria del momento:

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

Para resumirlo:

Obtener la zona horaria del usuario

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

Devoluciones, por ejemplo: Zona horaria: Europa / Londres

Establecer la zona horaria predeterminada del usuario

moment.tz.setDefault(tz);

Establecer zona horaria personalizada

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

Convierta la fecha / hora a la zona horaria local, se supone que la fecha / hora original está en UTC

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

Devoluciones: dom, 25 de diciembre de 2016, 7:00 a.m.

Convertir fecha / hora a LA Time

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

Devoluciones: sábado 24 de diciembre de 2016, 11:00 p.m.

Convertir de hora LA a Londres

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

Devoluciones: dom, 25 de diciembre de 2016, 3:00 p.m.

omarjebari
fuente
1

También puede usar https://www.npmjs.com/package/ctoc_timezone

Tiene mucha implementación simple y personalización de formato.

Cambio de formato en toTimeZone:

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

Salida:

28th Feb 2013 19:00:00 EST

Puede explorar múltiples funcionalidades en el documento.

Chowdary Sandeep
fuente
0

hay un módulo npm llamado 'timezones.json' que puede usar para esto; Básicamente consiste en un archivo json con objetos que contienen información sobre el horario de verano y el desplazamiento, ...

para asia / jakarta podría devolver 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"
  ]
}

Lo puedes encontrar aquí:

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

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

espero que sea útil

Kevin
fuente
0

Las personas familiarizadas con el java.timepaquete java 8 , o joda-timeprobablemente amarán al nuevo chico del bloque: la biblioteca js-joda .

Instalar en pc

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

Ejemplo

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

En la verdadera naturaleza de Java, es bastante detallado jajaja. Pero, al ser una biblioteca java portada, especialmente teniendo en cuenta que portaron casos de prueba de 1800, probablemente también funcione con gran precisión.

La manipulación cronológica es difícil. Es por eso que muchas otras bibliotecas tienen errores en casos extremos. Moment.js parece tener zonas horarias correctas, pero las otras bibliotecas js que he visto, incluidas timezone-js, no parecen confiables.

cabra
fuente
0

Recientemente hice esto en Typecript:

// 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;
}

Uso el formato "en-UK" porque es simple. Podría haber sido "en-US" o lo que funcione.

Si el primer argumento es su zona horaria local y la segunda es su zona horaria objetivo, devuelve un objeto Fecha con el desplazamiento correcto.

Alexandre Liscia
fuente
0

Estaba teniendo problemas para usar Moment Timezone . Estoy agregando esta respuesta solo si alguien más se enfrenta al mismo problema. Entonces tengo una cadena de fecha que 2018-06-14 13:51:00viene de mi API. Sé que esto se almacena enUTC pero la cadena no habla por sí sola.

Dejo que la zona horaria de momento sepa, de qué zona horaria es esta fecha al hacer:

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

Ahora me gustaría convertirlo a una zona horaria específica haciendo:

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
fuente
0

Simplemente configure la zona horaria de su país deseado y puede mostrar fácilmente en html que se actualiza utilizando la función SetInteval () después de cada minuto. formato de función AMPM () gestiona el formato de 12 horas y la visualización de la 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
fuente
-1

No conozco un método fácil para convertir un objeto de fecha a cualquier zona horaria, pero si desea convertirlo a la zona horaria local, puede convertirlo Date.prototype.getTime()al número correspondiente de milisegundos y volver de nuevo.

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

Por ejemplo, date.getHours()ahora volveré en 15lugar de 13si estás, como yo, en Austria (y es verano).

He leído que las diversas funciones de fecha y hora pueden exhibir un comportamiento no estándar en algunos navegadores, así que pruébelo primero. Puedo confirmar que funciona en Chrome.

黄 雨伞
fuente
1
¿Por qué fue rechazado? Esta es, con mucho, la mejor y más fácil forma de hacerlo. La mayoría de las respuestas anteriores no tienen en cuenta el horario de verano / invierno
MortenSickel
¿Cuál es el punto de la segunda línea? El constructor Fecha ya asume su zona horaria local. Ambas líneas devuelven una fecha en la zona horaria del navegador local, y no responden la pregunta sobre cómo convertir a otra zona horaria con el horario de verano.
Chloe
-1

Compensación de zona horaria para su zona horaria actual

date +%s -d '1 Jan 1970'

Para mi zona horaria GMT + 10 (Australia) devolvió -36000

Antonio
fuente
-6

Cambio de hora manual rápido y sucio y retorno:

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()
alemán
fuente
demasiado sucio (y demasiado desordenado)
Maxwell sc