it-swarm-eu.dev

Datum/Uhrzeit im Gebietsschema des Benutzers und Zeitversatz anzeigen

Ich möchte, dass der Server Datumsangaben in UTC im HTML-Format bereitstellt und JavaScript auf der Client-Site in die lokale Zeitzone des Benutzers konvertieren soll.

Bonus, wenn ich im Gebietsschema-Datumsformat des Benutzers ausgeben kann.

145
kch

Der einfachste Weg, um mit einem UTC-Datum zu beginnen, scheint das Erstellen eines neuen Date-Objekts und das Verwenden der setUTC…-Methoden, um das gewünschte Datum/die gewünschte Uhrzeit festzulegen.

Dann liefern die verschiedenen toLocale…String-Methoden eine lokalisierte Ausgabe.

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:

148
kch

Verwenden Sie für neue Projekte einfach moment.js

Diese Frage ist ziemlich alt, so dass moment.js zu dieser Zeit noch nicht existierte, aber für neue Projekte vereinfacht sie solche Aufgaben erheblich. 

Es ist am besten, parse Ihre Datumszeichenfolge aus UTC wie folgt zu erstellen (Erstellen Sie auf dem Server eine ISO-8601 -kompatible Zeichenfolge, um konsistente Ergebnisse für alle Browser zu erhalten.

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

Verwenden Sie jetzt einfach m in Ihrer Anwendung, moment.js verwendet standardmäßig die lokale Zeitzone für Anzeigeoperationen. 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 folgendermaßen formatieren:

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

Um ein moment.js-Objekt in eine andere Zeitzone umzuwandeln (d. H. Weder in die lokale noch in UTC), benötigen Sie die moment.js-Zeitzonenerweiterung . Diese Seite enthält auch einige Beispiele, die sehr einfach zu bedienen sind.

61
theDmi

Sie können new Date().getTimezoneOffset()/60 für die Zeitzone verwenden. Es gibt auch eine toLocaleString()-Methode zum Anzeigen eines Datums mithilfe der Ländereinstellung des Benutzers.

Hier ist die ganze Liste: Mit Datum arbeiten

19
jop

Nachdem Sie Ihr Datumsobjekt erstellt haben, finden Sie hier einen Ausschnitt für die Konvertierung:

Die Funktion akzeptiert ein UTC-formatiertes Date-Objekt 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);
}
6
simianarmy

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

In JS gibt es keine einfachen und plattformübergreifenden Möglichkeiten zum Formatieren der lokalen Datumszeit, abgesehen von der oben genannten Konvertierung der einzelnen Eigenschaften. 

Hier ist ein kurzer Hack, den ich benutze, um den lokalen YYYY-MM-DD zu bekommen. Beachten Sie, dass dies ein Hack ist, da das Enddatum nicht mehr die richtige Zeitzone hat (Sie müssen die Zeitzone daher 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)

D.getTimezoneOffset () gibt den Zeitzonenversatz in Minuten zurück, und d.getTime () ist in ms, also x 60.000.

4
Jeremy Chone

Die .getTimezoneOffset()-Methode meldet den Zeitzonenversatz in Minuten und zählt "westwärts" von der GMT/UTC-Zeitzone, was zu einem Versatzwert führt, der sich nach dem gewohnten Wert verschiebt. (Beispiel: Die New Yorker Zeit wird mit +240 Minuten oder +4 Stunden angegeben.)

Um einen normalen Zeitzonen-Versatz 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. Diese Methode gibt Ihnen also wirklich die Zeit Offset - nicht die tatsächliche geographische Zeitzone Offset.

3
Már Örlygsson

Mit Datum vom PHP Code habe ich so etwas verwendet ..

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

Ich mische die bisherigen Antworten und füge hinzu, weil ich sie alle lesen musste und zusätzlich eine Zeit lang untersuchen musste, um eine Datumszeitzeichenfolge 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 (siehe JavaScript zum Erkennen der Browsereinstellung ). Ich erhalte die Browsersprache daher vom Server.

Python/Django: Anforderungsbrowsersprache als Kontextparameter senden:

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. en-GB, en-US; q = 0,8, en; q = 0,6/und dann die erste Sprache in der Liste nur über replace und reguläre Ausdrücke nehmen

const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");

JavaScript: in datetime konvertieren und formatieren:

var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);

Siehe: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

Das Ergebnis ist (Browser-Sprache ist de-de): 05/12/2016, 14:58

3
Anja

Die beste Lösung, die ich gefunden habe, ist das Erstellen von [time display = "llll" datetime = "UTC TIME" /] -Tags. Verwenden Sie JavaScript (jquery), um diese zu analysieren und relativ zur Uhrzeit des Benutzers anzuzeigen.

http://momentjs.com/ Moment.js 

wird die Uhrzeit schön anzeigen.

2
Daniel

Sie können Folgendes verwenden, das den Zeitzonenversatz von GMT in Minuten angibt: 

new Date().getTimezoneOffset();

Hinweis : - Diese Funktion liefert eine negative Zahl.

2
dave

getTimeZoneOffset () und toLocaleString eignen sich gut für grundlegende Datumsarbeit. Wenn Sie jedoch Unterstützung für echte Zeitzonen benötigen, lesen Sie mde TimeZone.js

In der Antwort auf diese Frage werden einige weitere Optionen diskutiert.

1
Aeon

Um das Datum in ein lokales Datum zu konvertieren, verwenden Sie die toLocaleDateString () -Methode.

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

Verwenden Sie die Methode toLocaleTimeString (), um die Uhrzeit in Ortszeit umzuwandeln.

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

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

0
Sergey