Ich habe eine Website, die in einer anderen Zeitzone gehostet wird als die Benutzer, die die Anwendung verwenden. Darüber hinaus können Benutzer eine bestimmte Zeitzone haben. Ich habe mich gefragt, wie andere SO-Benutzer und -Anwendungen dies angehen. Der offensichtlichste Teil ist, dass in der Datenbank Datum und Uhrzeit in UTC gespeichert sind. Auf dem Server sollten alle Datums- und Uhrzeitangaben in UTC behandelt werden. Ich sehe jedoch drei Probleme, die ich zu überwinden versuche:
Abrufen der aktuellen Uhrzeit in UTC (einfach zu lösen mit
DateTime.UtcNow
).Datum und Uhrzeit aus der Datenbank abrufen und dem Benutzer anzeigen. Es gibt möglicherweise viele Anrufe, um Daten in verschiedenen Ansichten zu drucken. Ich dachte an eine Ebene zwischen der Ansicht und den Controllern, die dieses Problem lösen könnte. Oder mit einer benutzerdefinierten Erweiterungsmethode
DateTime
(siehe unten). Der Hauptnachteil ist, dass an jedem Ort, an dem eine Datums- / Uhrzeitangabe in einer Ansicht verwendet wird, die Erweiterungsmethode aufgerufen werden muss!Dies würde auch die Verwendung von etwas wie dem erschweren
JsonResult
. Man konnte nicht mehr einfach anrufenJson(myEnumerable)
, es müsste seinJson(myEnumerable.Select(transformAllDates))
. Vielleicht könnte AutoMapper in dieser Situation helfen?Eingaben vom Benutzer erhalten (Lokal zu UTC). Wenn Sie beispielsweise ein Formular mit einem Datum veröffentlichen möchten, müssen Sie das Datum zuvor in UTC konvertieren. Das erste, was mir in den Sinn kommt, ist das Erstellen eines Brauchs
ModelBinder
.
Hier sind die Erweiterungen, die ich in den Ansichten verwenden wollte:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
Ich würde denken, dass der Umgang mit Zeitzonen so häufig vorkommt, wenn man bedenkt, dass viele Anwendungen jetzt Cloud-basiert sind und die Ortszeit des Servers stark von der erwarteten Zeitzone abweichen kann.
Wurde dies schon einmal elegant gelöst? Fehlt mir etwas? Ideen und Gedanken werden sehr geschätzt.
EDIT: Um einige Verwirrung zu beseitigen, dachte ich, einige weitere Details hinzuzufügen. Im Moment geht es nicht darum, wie UTC-Zeiten in der Datenbank gespeichert werden, sondern vielmehr darum, von UTC-> Lokal und Lokal-> UTC zu wechseln. Wie @Max Zerbini betont, ist es natürlich klug, den UTC-> Lokalen Code in die Ansicht aufzunehmen, aber ist die DateTimeExtensions
wirklich die Antwort? Ist es sinnvoll, beim Abrufen von Eingaben vom Benutzer Datumsangaben als Ortszeit des Benutzers zu akzeptieren (da dies von JS verwendet wird) und dann eine ModelBinder
zu UTC-Transformation zu verwenden? Die Zeitzone des Benutzers wird in der Datenbank gespeichert und kann leicht abgerufen werden.
ModelBinder
.