Konvertieren Sie das Datum in eine andere Zeitzone in JavaScript

336

Ich suche nach einer Funktion, um das Datum in einer Zeitzone in eine andere umzuwandeln.

Es braucht zwei Parameter,

  • Datum (im Format "2012/04/10 10:10:30 +0000")
  • Zeitzonenzeichenfolge ("Asia / Jakarta")

Die Zeitzonenzeichenfolge ist in http://en.wikipedia.org/wiki/Zone.tab beschrieben

Gibt es eine einfache Möglichkeit, dies zu tun?

Rizky Ramadhan
quelle
1
Finden Sie den UTC-Versatz einer bestimmten Stadt. stackoverflow.com/questions/3002910/…
Brandon Boone
3
Ich möchte nicht nur den UTC-Versatz berechnen, sondern auch die Sommerzeit / Sommerzeit. Die Zeit wird also korrekt zurückkehren.
Rizky Ramadhan
Überprüfen Sie auch dieses stackoverflow.com/questions/16084313/…
Amol M Kulkarni
Versetzt Ihre Zeitzone mit dem Unix-Datumsbefehl: Datum +% s -d '1. Januar 1970'
Anthony

Antworten:

188

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
quelle
1
Ich habe die Antwort darauf geändert, da dies die richtige und standardmäßige Methode ist, ohne eine Bibliothek zu verwenden.
Rizky Ramadhan
5
Aus der MDN-Dokumentation geht eindeutig hervor, dass die einzige Zeitzone, die in allen Implementierungen erkannt werden muss, UTC ist. ( stackoverflow.com/questions/10087819/… ) Wenn Sie in IE11 auf die Schaltfläche [Code-Snippet ausführen] klicken, wird ein Fehler ausgegeben.
Vivian River
1
Wenn jemand nach einer Implementierung sucht, die momentan für alle Browser funktioniert, kann er die folgenden Antworten mit seinen eigenen Nachteilen ausprobieren ...
Rizky Ramadhan
14
Diese Antwort zeigt die korrekte Übergabe einer Zeitzone an toLocaleString, aber dann zeigt sie sehr falsch die Rückgabe dieser Zeichenfolge an den DateKonstruktor. Das verlangt nach Ärger. Der Datumszeichenfolgen-Parser muss keine länderspezifischen Formate akzeptieren, und die Eingabe wird so behandelt, als ob sie sich in der lokalen Zeitzone befindet. Tu das nicht. Verwenden Sie einfach die Zeichenfolgenausgabe des ersten toLocalStringAufrufs.
Matt Johnson-Pint
4
@ MattJohnson dann können Sie nicht getHour () oder solche Methoden verwenden
Ali Padida
131

Für Benutzer von moment.js können Sie jetzt moment-timezone verwenden . Wenn Sie es verwenden, würde Ihre Funktion ungefähr so ​​aussehen:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}
Brian Di Palma
quelle
3
Ich war mir nicht sicher, wie ich neue Zeitzonen hinzufügen sollte, die Dokumente halfen mir nicht. Ich bin nur ein Programmierer, kein Zeitexperte!
Parziphal
8
Das Problem hierbei ist, dass dies kein neues Date-Objekt zurückgibt, sondern eine Zeichenfolge. Wenn du das willst, ist das natürlich gut.
Nickdnk
2
Ist es nicht "Rückgabemoment (Zeit) .tz (Zone) .format (Format);" ? Die, die Sie in Ihrem Code angegeben haben, hat den Fehler "Ungültiges Datum".
Tarek
1
Es ist nicht möglich, Moment.js in den Browser zu laden. Sehr traurig :(
Daniil Shevelev
4
Wenn Sie nicht glücklich sind, 180 KB mit einer Kopie der tz-Datenbank an den Browser zu senden, und bei älteren Browsern mit einer Verschlechterung der aktuellen Zeitzone leben können, probieren Sie die Antwort von @ lambinator mit aus Date.prototype.toLocaleString.
Peter V. Mørch
92

Schamlos gestohlen von: 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();
}

Diese Funktion ist nützlich, um den Zeitzonenwert zu berechnen, indem der Name einer Stadt / eines Landes und der Versatzwert angegeben werden

Valli69
quelle
4
schön ... aber ich denke, er möchte, dass der Offset für ihn auf der Grundlage der übergebenen Stadt nachgeschlagen wird.
Brandon Boone
117
Änderungen der Sommerzeit werden dabei nicht berücksichtigt.
Robotbugs
12
beantwortet die Frage nicht, sondern beantwortet meine (+1)
Reign.85
Das '3600000' hat mich buchstäblich umgebracht! In der Eingabe sollte tz in Stunden angegeben werden! Und es sollte abgezogen werden. Wenn Sie also bestehen: var d = new Date calcTime ('', d.getTimezoneOffset () / 60); Es sollte die gleiche Zeit zurückgeben.
Praveen
1
Diese Antwort ist ernsthaft veraltet und sollte entfernt werden, insbesondere der Teil, der toLocaleString verwendet , der wahrscheinlich die Host-Zeitzone meldet , wenn sie in eine andere Zeitzone verschoben wurde. Es gibt viel bessere Möglichkeiten, Zeitstempel für verschiedene Offsets manuell zu erstellen.
RobG
89

Die meisten Desktop-Browser (nicht mobile Browser) außer Safari unterstützen die Funktion toLocaleString mit Argumenten. Ältere Browser ignorieren die Argumente normalerweise.

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
Lambinator
quelle
4
Fehler in Firefox und Edge :(
Šime Vidas
10
Da dies in FF und IE11 + schwer fehlschlägt, muss eine andere Lösung gefunden werden.
jdavid.net
2
Edge und Chrome mochten es :)
Suhail Mumtaz Awan
6
Es funktionierte gerade auf Chrome v59 und Firefox Desktop v54 und Chome auf Android v59 und Safari 10 auf iOS 10.3. Auf IE10 hat es nicht funktioniert. Die MDN-Beschreibung von Date.prototype.toLocaleString () enthält eine toLocaleStringSupportsLocales()Implementierung, mit der Sie zuverlässig nach Unterstützung suchen können.
Peter V. Mørch
1
Erfolgreich getestet in node.js v8.7.0
Heinrich Ulbricht
56

Okay, habe es gefunden!

Ich benutze timezone-js . Das ist der Code:

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
quelle
90
Ich muss dagegen stimmen, timezone-js unterstützt DST nicht und wirbt nicht dafür in seiner Readme-Datei, was es zu einem schlechten Tipp für Leute macht, die danach suchen. Siehe: github.com/mde/timezone-js/issues/51 und eine Reihe anderer Probleme, die eingereicht wurden und anscheinend nicht behoben werden.
@nus ja, aber es gibt wirklich keine Lösung für die clientseitige Zeitzonen- / Datumsverwaltung ... jquery ui datepicker hat mich deswegen verrückt gemacht. Prost
Lucas
2
@ Marabunta, sieht aus wie Moment-Zeitzone (Antwort von Brian Di Palma) unterstützt DST github.com/moment/moment-timezone/issues/21
welldan97
2
Verwenden Sie TimezoneJS nicht, da es sich um DST-Änderungen handelt.
Matf
17

Wenn Sie keine große Bibliothek importieren möchten, können Sie einfach Intl.DateTimeFormat verwenden , um Datumsobjekte in verschiedene Zeitzonen zu konvertieren.

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

Offsets, Sommerzeit und Änderungen in der Vergangenheit werden für Sie erledigt.

Endlos
quelle
IE10 + unterstützt die Intl-API für Zeitzonen nicht. moment.github.io/luxon/docs/manual/matrix.html
Chloe
Dies ist eigentlich die beste Antwort. toLocaleStringhat eine inkonsistente Implementierung, und dies funktioniert ab IE11.
dlsso
Zu Ihrer Information: Dies funktioniert in IE11 zumindest unter Windows 8.1 nicht. Wenn Sie versuchen, das formatterObjekt zu erstellen , erhalten Sie: `` `Optionswert 'Asia / Jakarta' für 'timeZone' liegt außerhalb des gültigen Bereichs. Erwartet: ['UTC'] `` `
veddermatic
Gibt es eine Möglichkeit, das Endergebnis aus dem Formatierer erneut in ein Datumsobjekt zu konvertieren?
mding5692
10

Ich habs !

Wollte das angezeigte Datum erzwingen = Serverdatum, egal die lokalen Einstellungen (UTC).

Mein Server ist GMT-6 -> new Date (). GetTimezoneOffset () = 360.

myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);
Cedric Simon
quelle
2
Obwohl die korrekte naive Zeit angezeigt wird, werden die Zeitzoneninformationen von myOldDateObj beibehalten. Eigentlich ist es also die falsche Zeit (wenn Sie sich Zeit als Instanz nehmen und nicht die Zeit auf einer Uhr).
gabn88
@ gabn88: Sie können die Serverzeit nicht mit Javascript ändern ... Um die Serverzeit zu korrigieren, tun Sie dies auf Betriebssystemebene.
Cedric Simon
2
Ich muss die Serverzeit nicht festlegen;) Die Serverzeit ist für mich immer UTC. Aber ich habe unterschiedliche Organisationen in unterschiedlichen Zeitzonen. Und ihre Geräte sollten immer die Zeit anzeigen, zu der ihre Organisation stationiert ist, wo immer sie sich befinden.
gabn88
Wir haben ein ähnliches Problem, Daten immer in der X-Zeitzone anzuzeigen. Wir versuchen, alle Daten im Zeichenfolgenformat vom Server zu senden und behandeln sie im Browser nur als lokale Zeitzonendaten.
Venkateswara Rao
5

Sie können die toLocaleString () -Methode zum Festlegen der Zeitzone verwenden.

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

Für Indien können Sie "Indian / Christmas" verwenden und die folgenden Zeitzonen sind:

"Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
Codemaker
quelle
Sie legen nicht die Zeitzone fest, sondern erstellen eine Zeichenfolge mit der in dieser Zeitzone ausgedrückten Zeit. Das Datum bleibt gleich.
Gerard ONeill
Die toLocaleStringLösung wurde bereits vor 4 Jahren gegeben .
Dan Dascalescu
4

Wenn Sie nur Zeitzonen konvertieren müssen, habe ich eine abgespeckte Version der Moment-Zeitzone mit nur minimaler Funktionalität hochgeladen . Seine ~ 1KB + Daten:

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

Stellen Sie eine Variable ein, bei der Jahr, Monat und Tag durch '-' Symbole sowie ein 'T' und die Zeit im Muster HH: mm: ss getrennt sind, gefolgt von +01: 00 am Ende der Zeichenfolge (in meinem Fall die Zeitzone ist +1). Verwenden Sie dann diese Zeichenfolge als Argument für den Datumskonstruktor.

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

Ich sollte beachten, dass ich in Bezug auf die externen Bibliotheken, die ich verwenden kann, eingeschränkt bin. moment.js und timezone-js waren für mich KEINE Option.

Das js-Datumsobjekt, das ich habe, befindet sich in UTC. Ich musste das Datum UND die Uhrzeit von diesem Datum in einer bestimmten Zeitzone (in meinem Fall 'Amerika / Chicago') abrufen.

 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 ist derzeit 6 Stunden vor 'America / Chicago'. Ausgabe ist:

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

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15
suchen27
quelle
11
new Date();Rückkehr lokale Zeitzone, nicht UTC
Mirko
1
aus den Dokumenten:If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
Mirko
Hmm. Ein bisschen verwirrend. Dadurch wird die Zeitzone eines Datums nicht geändert. Vielmehr wird ein neues Datum mit den geänderten Stunden erstellt. Es wäre viel klarer, einen regulären Ausdruck zu verwenden, um die gewünschten Werte aus der Zeichenfolge zu extrahieren, die aus dem Aufruf toLocaleString erstellt wird.
Gerard ONeill
2

Hier ist mein Code, er funktioniert perfekt. Sie können ihn mit der folgenden Demo ausprobieren:

$(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
quelle
Willkommen bei StackOverflow! Können Sie weitere Informationen darüber geben, wie dieser Code funktioniert und was er tut? Wie behebt es das Problem?
DarkSuniuM
Mein oben angegebener Code dient zum Aktualisieren Ihrer Zeitzone auf die Zeitzone anderer Länder.
Sahil Kapoor
Sie müssen den HTML-Code in Ihre HTML-Datei einfügen und der oben angegebene Abfragecode muss sich in der Fußzeile befinden. Es funktioniert für Sie gemäß ('en-US', {timeZone: 'America / Chicago'}). Sie müssen diese beiden Werte aktualisieren, wenn Sie die Zeitzone anderer Länder möchten. Danke
Sahil Kapoor
Nein, warte. Ich habe dies nur positiv bewertet, ohne genau hinzuschauen. Warum fügst du 1 hinzu currentDateTimeCentralTimeZone.getHours()? Ohne das würde es funktionieren und ist dasselbe wie die Antwort von suche27 stackackflow.com/a/40809160/1404185
chetstone
1

Sie können dies auch für die Konvertierung der Datumszeitzone nach Indien versuchen:

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
quelle
1
Nach dem 2. Schritt selbst bekomme ich die Zeit in Indien ... also warum fügst du immer noch 5 & 1/2 Stunden hinzu?
user3833732
Wenn ich diese Methode verwende, erhalte ich hier in Norwegen Folgendes, wenn ich mich mit Chrome tröste: Original: Do 27.09.2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Geändert: Do 27.09.2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid). "Sentraleuropeisk sommertid" bedeutet mitteleuropäische Sommerzeit. Ich bin mir nicht sicher, ob das funktionieren würde, wenn Sie Sommerzeit für Indien benötigen, oder umgekehrt, wenn Sie in Indien sind und Sommerzeit für Europa benötigen, und so weiter.
Kebman
Die Verwendung von setHours () wie diesem berücksichtigt keine Übergänge von Tag, Monat und Jahr, z. B. 3:30 Uhr in New Dell am 8. ist 23 Uhr am 7. in London. Betrachten Sie dann das Monatsende, das Jahr und die Schalttage. Lassen Sie Date das rechnen <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
1

Nachdem ich mich viel umgesehen hatte, einschließlich der Links von dieser Seite, fand ich diesen großartigen Artikel unter Verwendung der Moment-Zeitzone:

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

Um es zusammenzufassen:

Holen Sie sich die Zeitzone des Benutzers

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

Rückgabe zB: Zeitzone: Europa / London

Legen Sie die Standardzeitzone des Benutzers fest

moment.tz.setDefault(tz);

Stellen Sie eine benutzerdefinierte Zeitzone ein

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

Konvertieren Sie Datum / Uhrzeit in die lokale Zeitzone, vorausgesetzt, das ursprüngliche Datum / die ursprüngliche Uhrzeit ist in UTC

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

Rückgabe: So, 25. Dezember 2016, 7:00 Uhr

Konvertieren Sie Datum / Uhrzeit in LA Time

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

Rückgabe: Sa, 24. Dezember 2016, 23:00 Uhr

Konvertieren Sie von LA Zeit nach London

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

Rückgabe: So, 25. Dezember 2016, 15:00 Uhr

omarjebari
quelle
1

Sie können auch verwenden https://www.npmjs.com/package/ctoc_timezone verwenden

Es hat viel einfache Implementierung und Formatanpassung.

Ändern des Formats in toTimeZone:

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

Ausgabe :

28th Feb 2013 19:00:00 EST

Sie können im Dokument mehrere Funktionen untersuchen.

Sandeep Chowdary
quelle
0

Es gibt ein npm-Modul namens 'timezones.json', das Sie dafür verwenden können. Es besteht im Wesentlichen aus einer JSON-Datei mit Objekten, die Informationen zu Sommerzeit und Offset enthalten.

für asia / jakarta wäre es möglich, dieses objekt zurückzugeben:

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

Sie finden es hier:

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

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

hoffe es ist nützlich

Kevin
quelle
0

Leute, die mit dem Java 8- java.timePaket vertraut sind oder joda-timewahrscheinlich das neue Kind auf dem Block lieben werden: das js-joda Bibliothek.

Installieren

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

Beispiel

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

In der wahren Java-Natur ist es ziemlich ausführlich lol. Da es sich jedoch um eine portierte Java-Bibliothek handelt, insbesondere wenn man bedenkt, dass sie 1800'-Testfälle portiert hat, funktioniert sie wahrscheinlich auch hervorragend genau.

Chrono-Manipulation ist schwer. Aus diesem Grund sind viele andere Bibliotheken in Randfällen fehlerhaft. Moment.js scheint die Zeitzonen richtig zu machen, aber die anderen js-Bibliotheken, die ich gesehen habe timezone-js, scheinen nicht vertrauenswürdig zu sein.

Ziege
quelle
0

Ich habe dies kürzlich in Typescript getan:

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

Ich verwende das "en-UK" -Format, weil es einfach ist. Könnte "en-US" gewesen sein oder was auch immer funktioniert.

Wenn das erste Argument Ihre Gebietsschema-Zeitzone und das zweite Ihre Zielzeitzone ist, wird ein Datumsobjekt mit dem richtigen Versatz zurückgegeben.

Alexandre Liscia
quelle
0

Ich hatte Probleme mit Moment Timezone . Ich füge diese Antwort nur hinzu, wenn jemand anderes vor dem gleichen Problem steht. Ich habe also eine Datumszeichenfolge 2018-06-14 13:51:00von meiner API. Ich weiß, dass dies in gespeichert istUTC aber die Zeichenfolge spricht nicht für sich.

Ich lasse Moment Zeitzone wissen, von welcher Zeitzone dieses Datum ist, indem ich tue:

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

Jetzt möchte ich es in eine bestimmte Zeitzone konvertieren, indem ich Folgendes mache:

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

Stellen Sie einfach die Zeitzone Ihres gewünschten Landes ein und Sie können die Aktualisierung mit der Funktion SetInteval () nach jeder Minute in HTML anzeigen. FunktionsformatAMPM () verwaltet das 12-Stunden-Format und die AM / PM-Zeitanzeige.

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

Ich kenne keine einfache Methode, um ein Datumsobjekt in eine Zeitzone zu konvertieren, aber wenn Sie es in die lokale Zeitzone konvertieren möchten, können Sie es einfach mit Date.prototype.getTime()der entsprechenden Anzahl von Millisekunden konvertieren und wieder zurück.

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

Zum Beispiel date.getHours()wird jetzt zurückkehren, 15anstatt 13wenn Sie, wie ich, in Österreich sind (und es ist Sommer).

Ich habe gelesen, dass die verschiedenen Datums- / Uhrzeitfunktionen in einigen Browsern möglicherweise ein nicht standardmäßiges Verhalten aufweisen. Testen Sie dies daher zuerst. Ich kann bestätigen, dass es in Chrome funktioniert.

黄 雨伞
quelle
1
Warum wurde dies abgelehnt? Dies ist bei weitem der einfachste und beste Weg, dies zu tun. Die meisten der obigen Antworten berücksichtigen nicht die Sommer- / Winterzeit
MortenSickel
Was ist der Sinn der zweiten Zeile? Der Datumskonstruktor übernimmt bereits Ihre lokale Zeitzone. Beide Zeilen geben ein Datum in der Zeitzone des lokalen Browsers zurück und beantworten nicht die Frage, wie mit Sommerzeit in eine andere Zeitzone konvertiert werden kann.
Chloe
-1

Zeitzonenversatz für Ihre aktuelle Zeitzone

date +%s -d '1 Jan 1970'

Für meine GMT + 10-Zeitzone (Australien) gab es -36000 zurück

Anthony
quelle
-1

Ein Ansatz kann darin bestehen, den Versatz für eine neue Zeitzone zu einem bestimmten Zeitpunkt zu berechnen.

Keine direkte Lösung für diese Frage, aber in meinem Anwendungsfall musste ich mit der resultierenden Zeit rechnen, was mit der String-Ausgabe nicht möglich war. Ich lasse die Funktion hier einfach für alle.

Dies ist nur die Kernlogik, die in Node und Major Modern Browsern funktioniert.

function getTimezoneOffset(unixtime, timezone){

  // Convert Unix Time to Data Object
  var date = new Date(unixtime * 1000);


  // Define Options for Formatter
  var options = {
    year: 'numeric', month: 'long', day: '2-digit',
    hour: '2-digit', minute: '2-digit', second: '2-digit',
    timeZone: timezone
  };

  // Get Date in New Timezone
  var new_date_string = Intl.DateTimeFormat(void 0, options).format(date); // Output: May 15, 2020, 02:40:12 AM


  // New Time in Seconds with Error-Fix for Date Conversion
  var time_with_fix = (
    ( new Date(new_date_string) ).getTime() / 1000 - // Convert Date into Seconds (In Local Timezone)
    ( new Date().getTimezoneOffset() * 60 ) // Local Timezone Offset in Seconds
  );


  // Return Timezone Offset
  return ( time_with_fix - unixtime ); // Return Offset in Seconds

};


///////////////////////////TEST/////////////////////////////////
var current_time = Math.floor( new Date().getTime()/1000 ); 
console.log(
  "getTimezoneOffset(current_time, 'America/New_York'):",
  getTimezoneOffset(current_time, 'America/New_York')/3600
);
console.log(
  "getTimezoneOffset(current_time, 'Australia/Sydney'):",
  getTimezoneOffset(current_time, 'Australia/Sydney')/3600
);

SJ00
quelle
-6

schneller und schmutziger manueller Stundenwechsler und Rückgabe:

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()
Jerry
quelle
zu schmutzig (und zu chaotisch)
Maxwell sc