Frage

Ich mag der Server immer Daten in UTC im HTML dienen und JavaScript auf der Client-Seite wandelt es in den lokalen Zeitzone des Benutzers.

Bonus, wenn ich ausgeben kann im locale Datumsformat des Benutzers.

War es hilfreich?

Lösung

scheint die sicherste Art und Weise mit einem UTC-Datum zu starten, ist ein neues Date Objekt zu erstellen und die setUTC… Methoden verwenden, um das Datum / Uhrzeit einstellen Sie wollen.

Dann werden die verschiedenen toLocale…String Methoden lokalisierte Ausgabe liefern.

Beispiel:

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

Einige Referenzen:

Andere Tipps

Für neue Projekte, benutzen Sie einfach moment.js

Diese Frage ist ziemlich alt, so moment.js damals nicht existierte, sondern für neue Projekte, es vereinfacht Aufgaben wie diese viel.

Es ist am besten zu Parse Ihr Datum Zeichenfolge von UTC wie folgt (erstellen Sie ein ISO-8601 kompatibel Zeichenfolge auf dem Server konsistente Ergebnisse in allen Browsern zu erhalten):

var m = moment("2013-02-08T09:30:26Z");

Jetzt verwendet nur m in Ihrer Anwendung, moment.js standardmäßig auf die lokale Zeitzone für Anzeigeoperationen. Es gibt viele Möglichkeiten, um die Datums- und Zeitwerte zu formatieren oder Extrakt Teile davon.

Sie können sogar einen Moment Objekt formatieren in den Benutzer-Gebietsschema wie folgt aus:

m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us

Für die Transformation ein moment.js Objekt in einer anderen Zeitzone (dh weder die lokale eine noch UTC), müssen Sie die moment.js Zeitzone Erweiterung . Die Seite hat auch einige Beispiele, es ist ziemlich einfach zu bedienen.

Sie können new Date().getTimezoneOffset()/60 für die Zeitzone verwenden. Es gibt auch ein toLocaleString() Verfahren ein Datum für die Anzeige des Benutzers locale verwendet wird.

Hier ist die ganze Liste: mit Daten arbeiten

Wenn Sie Ihr Date-Objekt konstruiert haben, hier ist ein Ausschnitt für die Umwandlung:

Die Funktion nimmt einen UTC formatiert Date-Objekt und Format-String.
Sie erhalten einen Date.strftime Prototyp benötigen.

function UTCToLocalTimeString(d, format) {
    if (timeOffsetInHours == null) {
        timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
    }
    d.setHours(d.getHours() + timeOffsetInHours);

    return d.strftime(format);
}

In JS gibt es keine einfache und plattformübergreifenden Möglichkeiten, lokales Datum Zeit zu formatieren, außerhalb jede Eigenschaft der Umwandlung wie oben erwähnt.

Hier ist eine schnelle Hack, den ich das lokale YYYY-MM-DD erhalten verwenden. Beachten Sie, dass dies ein Hack ist, da das endgültige Datum wird nicht die richtige Zeitzone hat mehr (so müssen Sie Zeitzone ignorieren). Wenn ich irgendetwas anderes mehr benötigen, verwende 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)

Die d.getTimezoneOffset () gibt die Zeitzone, in Minuten versetzt, und die d.getTime () ist in ms, also die x 60.000.

Hier ist, was ich in früheren Projekten verwendet haben:

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

Die .getTimezoneOffset() Methode meldet die Zeitzone in Minuten versetzt, „nach Westen“ von GMT / UTC-Zeitzone zu zählen, was zu einem Offset-Wert, der negativ ist, was man ist häufig daran gewöhnt. (Beispiel, New York Zeit, um 240 Minuten oder 4 Stunden berichtet werden würde)

Um die normale Zeitzone in Stunden versetzt bekommen, müssen Sie 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 Offset -. Nicht die tatsächliche geographische Zeitzone Offset

Mit Datum von PHP-Code habe ich so etwas wie diese ..

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 die Antworten mischen, so weit und in den sie, weil ich sie alle und untersuchen zusätzlich für eine Weile hatte zu lesen Datum Zeit Zeichenfolge von DBs in einem Benutzer Format lokalen Zeitzone angezeigt werden soll.

Die Datetime-Zeichenfolge stammt aus einem Python / Django db im Format: 2016-12-05T15: 12: 24.215Z

Sichere Erkennung der Browser-Sprache in JavaScript scheint nicht in allen Browsern zu funktionieren (siehe https: //developer.mozilla .org / en / docs / Web / JavaScript / Reference / Global_Objects / Datum / toLocaleDateString

Das Ergebnis ist (Browser-Sprache ist de-de): 2016.05.12, 14.58

Die beste Lösung, die ich begegnet bin ist [Zeitanzeige = „llll“ datetime = „UTC TIME“ /] Tags zu erstellen, und verwenden Sie Javascript (jQuery), um die Zeit des Benutzers relativ zu analysieren und anzuzeigen.

http://momentjs.com/ Moment.js

wird die Zeit schön angezeigt werden soll.

Sie können die folgenden verwendet werden, die die Zeitzone von GMT in Minuten Offset berichtet:

new Date().getTimezoneOffset();

Hinweis:  -. Diese Funktion eine negative Zahl zurückgeben

getTimezoneOffset () und toLocaleString sind gut für die Ecktermin Arbeit, aber wenn Sie echte Zeitzone Unterstützung benötigen, suchen Sie unter mde des TimeZone.js .

Es gibt ein paar Optionen in der Antwort zu diskutiere diese Frage

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

Bis heute an lokalen Datum Verwendung toLocaleDateString () -Methode konvertiert.

var date = (new Date(str)).toLocaleDateString(defaultlang, options);

Zur Zeit Ortszeit Verwendung toLocaleTimeString () -Methode konvertiert.

var time = (new Date(str)).toLocaleTimeString(defaultlang, options);

Sie wissen nicht, wie locale zu tun, aber JavaScript ist eine Client-Side-Technologie.

usersLocalTime = new Date();

wird die Client-Zeit und das Datum in ihm (wie von ihrem Browser gemeldet, und durch Erweiterung der Computer sie sitzen). Es sollte trivial sein die Server-Zeit in der Antwort eingebunden und einige einfache Mathematik tun erraten-schätzen gegenüber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top