Antworten:
Der kinderleichteste Weg, um mit einem UTC-Datum zu beginnen, besteht darin, ein neues Date
Objekt zu erstellen und es mithilfe der setUTC…
Methoden auf das gewünschte Datum und die gewünschte Uhrzeit einzustellen.
Dann toLocale…String
liefern die verschiedenen Methoden eine lokalisierte Ausgabe.
// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);
console.log(d); // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString()); // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString()); // -> 02/28/2004
console.log(d.toLocaleTimeString()); // -> 23:45:26
var d = new Date(Date.UTC(2004,1,29,2,45,26));
toLocaleString()
Funktionen nicht berücksichtigt .
Diese Frage ist ziemlich alt, daher gab es moment.js zu diesem Zeitpunkt noch nicht, aber für neue Projekte vereinfacht sie Aufgaben wie diese erheblich .
Am besten analysieren Sie Ihre Datumszeichenfolge von UTC wie folgt (erstellen Sie eine ISO-8601- kompatible Zeichenfolge auf dem Server, um konsistente Ergebnisse für alle Browser zu erhalten):
var m = moment("2013-02-08T09:30:26Z");
Verwenden m
Sie jetzt einfach in Ihrer Anwendung moment.js standardmäßig die lokale Zeitzone für Anzeigevorgänge. Es gibt viele Möglichkeiten, Datums- und Uhrzeitwerte zu formatieren oder Teile davon zu extrahieren.
Sie können sogar ein Momentobjekt im Gebietsschema des Benutzers wie folgt formatieren:
m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us
Um ein moment.js-Objekt in eine andere Zeitzone umzuwandeln (dh weder die lokale noch die UTC-Zeitzone), benötigen Sie die Zeitzonenerweiterung moment.js . Diese Seite hat auch einige Beispiele, es ist ziemlich einfach zu bedienen.
For old projects, just use jQuery
Sie können new Date().getTimezoneOffset()/60
für die Zeitzone verwenden. Es gibt auch eine toLocaleString()
Methode zum Anzeigen eines Datums anhand des Gebietsschemas des Benutzers.
Hier ist die ganze Liste: Arbeiten mit Daten
toLocaleString
?
Nachdem Sie Ihr Datumsobjekt erstellt haben, finden Sie hier einen Ausschnitt für die Konvertierung:
Die Funktion verwendet ein UTC-formatiertes Datumsobjekt und eine Formatzeichenfolge.
Sie benötigen einen Date.strftime
Prototyp.
function UTCToLocalTimeString(d, format) {
if (timeOffsetInHours == null) {
timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
}
d.setHours(d.getHours() + timeOffsetInHours);
return d.strftime(format);
}
getTimezoneOffset()/60
möglicherweise einen Bruch zurückgibt (z. B. gibt ein Indien-Offset von +05: 30 5,5 zurück). Dezimalstellen werden abgeschnitten. Andernfalls werden durch das Einstellen der Stunden andere Werte aktualisiert (setzen Sie die Stunden auf 48 und sehen Sie, was passiert).
In JS gibt es keine einfachen und plattformübergreifenden Möglichkeiten zum Formatieren der lokalen Datums- und Uhrzeitangabe, außer dass jede Eigenschaft wie oben erwähnt konvertiert wird.
Hier ist ein kurzer Hack, mit dem ich das lokale JJJJ-MM-TT erhalte. Beachten Sie, dass dies ein Hack ist, da das Enddatum nicht mehr die richtige Zeitzone hat (Sie müssen also die Zeitzone ignorieren). Wenn ich noch etwas brauche, benutze ich moment.js.
var d = new Date();
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0,0);
// 2017-05-09T08:24:26.581Z (but this is not UTC)
Das d.getTimezoneOffset () gibt den Zeitzonenversatz in Minuten zurück, und das d.getTime () ist in ms, daher x 60.000.
Folgendes habe ich in früheren Projekten verwendet:
var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set. again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');
getTimezoneOffset()/60
wird häufig ein Dezimalwert zurückgegeben. Dies gilt insbesondere für Daten vor 1900, bei denen viele Orte in Minuten und Sekunden versetzt waren. Außerdem sind jetzt Javascript-Daten erforderlich, um historische Offsets zu unterstützen. Beispielsweise betrug der Versatz in Moskau 1890 +2: 30: 17. Siehe Browser, Zeitzonen, Chrome 67-Fehler .
Die .getTimezoneOffset()
Methode gibt den Zeitzonenversatz in Minuten an und zählt "westwärts" von der GMT / UTC-Zeitzone, was zu einem Versatzwert führt, der negativ ist, wie man es normalerweise gewohnt ist. (Beispiel: Die New Yorker Zeit würde +240 Minuten oder +4 Stunden betragen.)
Um einen normalen Zeitzonenversatz in Stunden zu erhalten, müssen Sie Folgendes verwenden:
var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60
Wichtiges Detail:
Beachten Sie, dass die Sommerzeit in das Ergebnis einbezogen wird - so , was diese Methode gibt Ihnen ist wirklich die Zeit versetzt - nicht die tatsächliche geographische Zeitzone gegenüber .
Mit Datum aus PHP-Code habe ich so etwas benutzt ..
function getLocalDate(php_date) {
var dt = new Date(php_date);
var minutes = dt.getTimezoneOffset();
dt = new Date(dt.getTime() + minutes*60000);
return dt;
}
Wir können es so nennen
var localdateObj = getLocalDate('2015-09-25T02:57:46');
Ich mische die bisherigen Antworten und füge sie hinzu, da ich sie alle lesen und eine Weile zusätzlich untersuchen musste, um eine Datums- / Zeitzeichenfolge von db im lokalen Zeitzonenformat eines Benutzers anzuzeigen.
Die datetime-Zeichenfolge stammt aus einer Python / Django-Datenbank im Format: 2016-12-05T15: 12: 24.215Z
Die zuverlässige Erkennung der Browsersprache in JavaScript scheint nicht in allen Browsern zu funktionieren ( Informationen zum Erkennen der Einstellungen für die Browsersprache finden Sie unter JavaScript ), daher erhalte ich die Browsersprache vom Server.
Python / Django: Sende die Sprache des Anforderungsbrowsers als Kontextparameter:
language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })
HTML: schreibe es in eine versteckte Eingabe:
<input type="hidden" id="browserlanguage" value={{ language }}/>
JavaScript: Wert der versteckten Eingabe abrufen, z. B. en-GB, en-US; q = 0,8, en; q = 0,6 / und dann die erste Sprache in der Liste nur über Ersetzen und regulären Ausdruck übernehmen
const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");
JavaScript: In Datum / Uhrzeit konvertieren und formatieren:
var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);
Das Ergebnis ist (Browsersprache ist en-gb): 05/12/2016, 14:58
// new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
var serverDate = new Date(2018, 5, 30, 19, 13, 15); // just any date that comes from server
var serverDateStr = serverDate.toLocaleString("en-US", {
year: 'numeric',
month: 'numeric',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric'
})
var userDate = new Date(serverDateStr + " UTC");
var locale = window.navigator.userLanguage || window.navigator.language;
var clientDateStr = userDate.toLocaleString(locale, {
year: 'numeric',
month: 'numeric',
day: 'numeric'
});
var clientDateTimeStr = userDate.toLocaleString(locale, {
year: 'numeric',
month: 'numeric',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric'
});
console.log("Server UTC date: " + serverDateStr);
console.log("User's local date: " + clientDateStr);
console.log("User's local date&time: " + clientDateTimeStr);
options
Teil für meinen Fall)
Die beste Lösung, auf die ich gestoßen bin, besteht darin, [time display = "llll" datetime = "UTC TIME" /] -Tags zu erstellen und Javascript (jquery) zu verwenden, um es relativ zur Zeit des Benutzers zu analysieren und anzuzeigen.
http://momentjs.com/ Moment.js
wird die Zeit schön anzeigen.
getTimeZoneOffset () und toLocaleString eignen sich gut für die grundlegende Datumsarbeit. Wenn Sie jedoch echte Zeitzonenunterstützung benötigen, schauen Sie sich die TimeZone.js von mde an .
In der Antwort auf diese Frage werden einige weitere Optionen erläutert
Verwenden Sie die Methode toLocaleDateString (), um das Datum in das lokale Datum zu konvertieren.
var date = (new Date(str)).toLocaleDateString(defaultlang, options);
Verwenden Sie die Methode toLocaleTimeString (), um die Zeit in die Ortszeit umzuwandeln.
var time = (new Date(str)).toLocaleTimeString(defaultlang, options);
Ich weiß nicht, wie man das Gebietsschema macht, aber Javascript ist eine clientseitige Technologie.
usersLocalTime = new Date();
enthält die Uhrzeit und das Datum des Kunden (wie von seinem Browser und im weiteren Sinne von dem Computer, auf dem er sitzt) gemeldet. Es sollte trivial sein, die Zeit des Servers in die Antwort einzubeziehen und einige einfache Berechnungen durchzuführen, um den Versatz zu erraten.
toLocateDateString()