Converti la data in un altro fuso orario in JavaScript


336

Sto cercando una funzione per convertire la data in un fuso orario in un altro.

Ha bisogno di due parametri,

  • data (nel formato "2012/04/10 10:10:30 +0000")
  • stringa del fuso orario ("Asia / Jakarta")

La stringa del fuso orario è descritta in http://en.wikipedia.org/wiki/Zone.tab

C'è un modo semplice per farlo?


1
Trova l'offset UTC di una determinata città. stackoverflow.com/questions/3002910/…
Brandon Boone

3
Voglio calcolare non solo l'offset UTC ma anche l'ora legale / l'ora legale. Quindi il tempo tornerà correttamente.
Rizky Ramadhan,



Off set del fuso orario usando il comando unix date: date +% s -d '1 gen 1970'
anthony

Risposte:


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


1
Ho cambiato la risposta a questo, dal momento che questo è il metodo corretto e standard senza usare alcuna libreria.
Rizky Ramadhan,

5
La documentazione MDN afferma chiaramente che l'unico fuso orario che deve essere riconosciuto in tutte le implementazioni è UTC. ( stackoverflow.com/questions/10087819/… ) Facendo clic sul pulsante [Esegui snippet di codice] in IE11 si verifica un errore.
Fiume Vivian,

1
Se qualcuno cerca un'implementazione che
funzioni

14
Questa risposta mostra il passaggio corretto di un fuso orario a toLocaleString, ma mostra in modo molto errato il passaggio di quella stringa nel Datecostruttore. Questo sta chiedendo problemi. Il parser della stringa della data non è tenuto ad accettare formati specifici della locale e l'input verrebbe trattato come se fosse nel fuso orario locale. Non farlo. Basta usare l'output di stringa dalla prima toLocalStringchiamata.
Matt Johnson-Pint,

4
@MattJohnson allora non puoi usare getHour () o simili metodi
Ali Padida

131

Per gli utenti di moment.js , ora puoi utilizzare moment-timezone . Usandolo, la tua funzione sarebbe simile a questa:

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

3
Non ero sicuro di come aggiungere nuovi fusi orari, i documenti non mi hanno aiutato. Sono solo un programmatore, non un esperto di tempo!
Parziphal,

8
Il problema qui è che questo non restituisce un nuovo oggetto Date, ma restituisce una stringa. Se è quello che vuoi, va bene, ovviamente.
nickdnk,

2
Non è "return moment (time) .tz (zone) .format (format);" ? Quello che hai dato nel tuo codice ha l'errore "Data non valida".
Tarek,

1
Non è possibile caricare Moment.js nel browser. Molto triste :(
Daniil Shevelev,

4
Se non sei felice di inviare 180K al browser con una copia del database tz e puoi vivere con degrado al fuso orario corrente sui browser più vecchi, prova la risposta di @ lambinator usando Date.prototype.toLocaleString.
Peter V. Mørch,

92

Rubato senza vergogna da: 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();
}

questa funzione è utile per calcolare il valore del fuso orario fornendo il nome di una città / paese e il valore di offset


4
bello .... ma penso che voglia cercare l'offset per lui in base al passato in città.
Brandon Boone,

117
Ciò non tiene conto delle modifiche dell'ora legale.
Robotbugs

12
non risponde alla domanda ma risponde alla mia (+1)
Regno 85,

Quel "3600000" mi ha letteralmente ucciso! Nell'input, tz dovrebbe essere dato in ore! E dovrebbe essere sottratto. Quindi, se passi: var d = new Date calcTime ('', d.getTimezoneOffset () / 60); Dovrebbe restituire lo stesso tempo.
Praveen

1
Questa risposta è seriamente obsoleta e dovrebbe essere rimossa, in particolare la parte che utilizza toLocaleString , che probabilmente riporterà il fuso orario dell'host quando è stato spostato in un fuso orario diverso. Esistono modi molto migliori per creare manualmente timestamp per diversi offset.
RobG

89

La maggior parte dei browser desktop (non mobili) ad eccezione di Safari supporta la funzione toLocaleString con argomenti, i browser più vecchi di solito ignorano gli argomenti.

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

4
Non funziona in Firefox e Edge :(
Šime Vidas il

10
Poiché ciò non riesce in FF e IE11 +, è necessario trovare un'altra soluzione.
jdavid.net,

2
A Edge e Chrome è piaciuto :)
Suhail Mumtaz Awan,

6
Ha funzionato proprio ora su Chrome v59 e Firefox desktop v54 e Chome su Android v59 e Safari 10 su iOS 10.3. Non ha funzionato su IE10. La descrizione di MDN di Date.prototype.toLocaleString () ha toLocaleStringSupportsLocales()un'implementazione che ti consente di verificare in modo affidabile il supporto.
Peter V. Mørch,

1
Testato con successo in node.js v8.7.0
Heinrich Ulbricht il

56

Ok, l'ho trovato!

Sto usando timezone-js . questo è il codice:

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

90
Devo votare contro questo, timezone-js non supporta l'ora legale e non lo pubblicizza nel suo readme, il che lo rende un pessimo consiglio per le persone che lo cercano. Vedi: github.com/mde/timezone-js/issues/51 e una serie di altri problemi che sono stati archiviati e che non sembrano risolti.

Sì, ma in realtà non esiste una soluzione per la gestione del fuso orario / data lato client ... jquery ui datepicker mi sta facendo impazzire per questo. salute
Lucas,

2
@Marabunta, sembra che il fuso orario del momento (risposta di Brian Di Palma) supporti l'ora legale github.com/moment/moment-timezone/issues/21
welldan97

2
Non usare TimezoneJS, è disturbato dalle modifiche all'ora legale.
matf

17

Se non vuoi importare alcune grandi librerie, puoi semplicemente usare Intl.DateTimeFormat per convertire gli oggetti Date in fusi orari diversi.

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

Offset, ora legale e cambiamenti in passato saranno curati per te.


IE10 + non supporta l'API Intl per i fusi orari. moment.github.io/luxon/docs/manual/matrix.html
Chloe

Questa è in realtà la migliore risposta. toLocaleStringha un'implementazione incoerente e funziona da IE11 in poi.
dlsso,

Cordiali saluti: Questo in realtà non funziona in IE11, almeno su Windows 8.1. Quando si tenta di creare l' formatteroggetto, si ottiene: `` Valore opzione 'Asia / Jakarta' per 'timeZone' è al di fuori dell'intervallo valido. Previsto: ['UTC'] `` `
veddermatic

c'è un modo per convertire di nuovo il risultato finale dal formatter in un oggetto Date?
mding5692

10

Fatto !

Volevo forzare la data mostrata = data del server, niente meno le impostazioni locali (UTC).

Il mio server è GMT-6 -> nuova data (). GetTimezoneOffset () = 360.

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

2
Sebbene mostri il tempo ingenuo corretto, vengono conservate le informazioni sul fuso orario di myOldDateObj. Quindi in realtà è l'ora sbagliata (quando prendi il tempo come istanza nel tempo e non l'ora dell'orologio).
gabn88,

@ gabn88: non sarai in grado di modificare l'ora del server utilizzando Javascript ... Per correggere l'ora del server, fallo a livello di sistema operativo.
Cedric Simon,

2
Non ho bisogno di correggere l'ora del server;) L'ora del server è sempre UTC per me. Ma ho un'organizzazione diversa in fusi orari diversi. E i loro dispositivi dovrebbero sempre mostrare l'ora in cui è situata la loro organizzazione, ovunque si trovino.
gabn88,

Abbiamo un problema simile nel mostrare le date sempre X fuso orario. Proviamo a inviare tutte le date in formato stringa dal server e nel browser le trattiamo semplicemente come date del fuso orario locale.
Venkateswara Rao,

5

È possibile utilizzare il metodo toLocaleString () per impostare il fuso orario.

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

Per l'India è possibile utilizzare "Indiano / Natale" e le seguenti sono le varie fasce orarie,

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

Non stai impostando il fuso orario, ma piuttosto producendo una stringa con il tempo espresso in quel fuso orario. La data rimane la stessa.
Gerard ONeill,

La toLocaleStringsoluzione è già stata data 4 anni fa .
Dan Dascalescu,

4

Se hai solo bisogno di convertire i fusi orari, ho caricato una versione ridotta del fuso orario con la minima funzionalità minima. I suoi dati ~ 1KB +:

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

2

Imposta una variabile con anno, mese e giorno separati da simboli "-", più una "T" e il tempo in HH: mm: modello ss, seguito da +01: 00 alla fine della stringa (nel mio caso il il fuso orario è +1). Quindi utilizzare questa stringa come argomento per il costruttore della 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 );

2

Devo notare che sono limitato rispetto a quali librerie esterne posso usare. moment.js e timezone-js NON erano un'opzione per me.

L'oggetto js date che ho è in UTC. Avevo bisogno di ottenere la data E l'ora da questa data in un fuso orario specifico ("America / Chicago" nel mio 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 è attualmente di 6 ore avanti rispetto a "America / Chicago". L'output è:

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

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

11
new Date();ritorna fuso orario locale, non UTC
Mirko

1
dai documenti: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 po 'confuso. Questo non cambia il fuso orario in una data; piuttosto crea una nuova data con le ore modificate. Sarebbe molto più chiaro usare un'espressione regolare per estrarre i valori desiderati dalla stringa creata dalla chiamata toLocaleString.
Gerard ONeill,

2

Ecco il mio codice, funziona perfettamente, puoi provare con la demo di seguito:

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


Benvenuto in StackOverflow! Puoi fornire ulteriori informazioni su come funziona questo codice e cosa fa? Come risolve il problema?
DarkSuniuM,

Il mio codice sopra riportato è di aggiornare il fuso orario ad altri paesi.
Sahil Kapoor,

Devi inserire l'HTML nel tuo file html e il codice jquery sopra riportato deve essere nel piè di pagina. Funzionerà per te secondo ('en-US', {timeZone: 'America / Chicago'}) devi aggiornare questi due valori, se vuoi il fuso orario di altri paesi Grazie
Sahil Kapoor,

Non aspettare. Ho appena votato questo senza guardare attentamente. Perché stai aggiungendo 1 a currentDateTimeCentralTimeZone.getHours()? Senza di che avrebbe funzionato ed è la stessa risposta di seeking27 stackoverflow.com/a/40809160/1404185
chetstone

1

Puoi provare anche questo per convertire il fuso orario della data in 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);

1
dopo il secondo passaggio in sè ottengo il tempo in India ... quindi perché stai ancora aggiungendo 5 & 1 / 2hrs?
user3833732

Quando uso questo metodo ottengo quanto segue qui in Norvegia quando consolo il registro con Chrome: Originale: Gio 27 Set 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Modificato: gio 27 set 2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid). "Sentraleuropeisk sommertid" indica l'ora legale dell'Europa centrale. Non sono sicuro che funzionerebbe quando hai bisogno dell'ora legale per l'India, o viceversa quando sei in India e hai bisogno dell'ora legale per l'Europa, e così via.
Kebman,

L'uso di setHours () in questo modo non tiene conto delle transizioni di giorno, mese e anno, ad esempio le 3:30 del mattino a New Dell l'8 e le 23:00 del 7 a Londra. Quindi considerare la fine del mese, dell'anno e dei giorni bisestili. Chiedi a Date di fare questo calcolo <pre> che 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); lascia timezone_str = std_timezone.timezone_str; </pre>
Lincoln Randall McFarland,

1

Dopo aver guardato molto, inclusi i collegamenti da questa pagina, ho trovato questo fantastico articolo, usando il fuso orario moment:

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

Per riassumere:

Ottieni il fuso orario dell'utente

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

Restituisce ad esempio: Fuso orario: Europa / Londra

Imposta il fuso orario dell'utente predefinito

moment.tz.setDefault(tz);

Imposta fuso orario personalizzato

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

Converti la data / ora nel fuso orario locale, presuppone che la data / ora originale sia in UTC

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

Ritorni: dom, 25 dicembre 2016, 7:00

Convertire data / ora in ora di Los Angeles

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

Ritorni: sabato 24 dicembre 2016, ore 23:00

Converti da Los Angeles a Londra

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

Ritorni: dom, 25 dicembre 2016, 15:00


1

Puoi anche utilizzare https://www.npmjs.com/package/ctoc_timezone

Ha un'implementazione e una personalizzazione del formato molto semplici.

Modifica del formato in TimeZone:

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

Produzione :

28th Feb 2013 19:00:00 EST

Puoi esplorare più funzionalità nel documento.


0

c'è un modulo npm chiamato 'timezones.json' che puoi usare per questo; consiste sostanzialmente in un file json con oggetti contenenti informazioni sull'ora legale e offset, ....

per asia / jakarta sarebbe in grado di restituire questo oggetto:

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

Potete trovare qui:

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

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

spero sia utile


0

Le persone che hanno familiarità con il java.timepacchetto java 8 o joda-timeprobabilmente adoreranno il nuovo bambino sul blocco: il js-joda libreria .

Installare

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

Esempio

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

Nella vera natura java, è piuttosto prolisso. Ma, essendo una libreria java con port, specialmente considerando che hanno portato port di test di fine XIX secolo, probabilmente funziona anche in modo superbo con precisione.

La manipolazione del crono è difficile. Ecco perché molte altre librerie sono buggy nei casi limite. Moment.js sembra avere i fusi orari corretti, ma le altre librerie js che ho visto, incluso timezone-js, non sembrano affidabili.


0

Di recente l'ho fatto in 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;
}

Uso il formato "en-UK" perché è semplice. Potrebbe essere stato "en-US" o qualunque cosa funzioni.

Se il primo argomento è il fuso orario locale e il secondo è il fuso orario target, restituisce un oggetto Date con l'offset corretto.


0

Ho avuto problemi con l'utilizzo del fuso orario Moment . Sto aggiungendo questa risposta solo se qualcun altro deve affrontare lo stesso problema. Quindi ho una stringa di date che 2018-06-14 13:51:00proviene dal mioAPI . So che questo è memorizzato inUTC ma la stringa non parla da sola.

Lascio sapere al momento il fuso orario, da quale fuso orario proviene questa data facendo:

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

Ora vorrei convertirlo in un fuso orario specifico facendo:

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.

0

Basta impostare il fuso orario desiderato per il proprio Paese e si può facilmente mostrare in html che si aggiorna usando la funzione SetInteval () dopo ogni minuto. formato funzione AMPM () gestisce il formato 12 ore e la visualizzazione dell'ora 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;
        }


    });

-1

Non conosco un metodo semplice per convertire un oggetto data in qualsiasi fuso orario, ma se si desidera convertirlo nel fuso orario locale, è possibile convertirlo con Date.prototype.getTime()il numero corrispondente di millisecondi e viceversa.

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

Ad esempio, date.getHours()ora verrà restituito 15anziché13 se sei, come me, in Austria (ed è estate).

Ho letto che le varie funzioni del datetime possono presentare comportamenti non standard in alcuni browser, quindi prova prima questo. Posso confermare che funziona in Chrome.


1
Perché questo è stato votato verso il basso? Questo è di gran lunga il modo più semplice e migliore per farlo. La maggior parte delle risposte di cui sopra non tiene conto
dell'ora legale

Qual è il punto della seconda linea? Il costruttore della data presuppone già il fuso orario locale. Entrambe queste righe restituiscono una data nel fuso orario del browser locale e non rispondono alla domanda su come convertire in un altro fuso orario con l'ora legale.
Chloe,

-1

Offset fuso orario per il fuso orario corrente

date +%s -d '1 Jan 1970'

Per il mio fuso orario GMT + 10 (Australia) ha restituito -36000


-6

cambio orario e ritorno manuali rapidi e sporchi:

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()

troppo sporco (e troppo disordinato)
Maxwell sc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.