Wo kann ein UTC-Datum / Uhrzeit-Wert in einer n-Tier-Anwendung festgelegt werden: Präsentationsebene, Domäne oder Datenbank?

Dies scheint eine naheliegende Frage zu sein, aber ich hatte einige Probleme, eine gute Antwort zu finden. Ich erstelle eine n-Tier-Anwendung, die UTC-zeitkritisch sein muss. Werte können aktualisiert werden und wenn es sich um Zeitstempel handelt, werden diese aufgezeichnet. Dies schließt Transaktionen in der Datenbank ein, bei denen Aktualisierungen oder Einfügungen Auswirkungen auf datetime-Spalten haben.

Um etwas Kontext zu geben, verwende ich SQL 2008 R2 + mit DATETIMEOFFSET (2) für die meisten meiner datetime-Spalten. Ich denke darüber nach, die Aktualisierungen für Zeitstempel in die gespeicherten Prozeduren zu übernehmen, damit sie nicht über das Netzwerk weitergeleitet werden müssen. Dies spart Bandbreite, wenn das System wächst, was eine gute Sache ist ... und kann verwendet werden, um zu überprüfen, ob sich Daten an gemeinsam genutzten Daten ändern (zuerst gewinnen). Die Kehrseite ist, dass die erste, die eine Transaktion einreicht, möglicherweise nicht diejenige ist, die gewinnt, wenn sie auf ihrer Instanz der Anwendung auf eine langsamere Antwortzeit stößt.

Was ist in diesem Zusammenhang die ideale oder empfohlene Art, mit UTC-Zeitdaten umzugehen?

Setze es im SPROC mit SYSUTCDATETIME () ODER ...Stellen Sie es in der Anwendung mit DateTimeOffset.Now oder DateTime.UtcNow ein

Wenn zwei oben aufgeführt sind, wird empfohlen, dies auf der Präsentationsebene auszulösen und über den Dienst an die Domänenebene weiterzuleiten, oder nur festzulegen, wenn die Domäne im Back-End des Dienstes erreicht wird.

Wie Sie sehen, gibt es hier viele Optionen und ich neige zur Datenbank ... aber ich würde mich über Ratschläge oder warnende Worte freuen, bevor ich mit dem Aufbau dieses Dings fortfahre.

Randnotiz: Ich verfolge auch Geodaten ... aber dies ist kein hartes Echtzeitsystem. Benutzer Echtzeit ist mehr als ausreichend.

UPDATE: Ich werde DateTimeOffset in der Anwendung verwenden. Meine Recherche hat mich zu dem Ergebnis geführt, dass Sie "zuverlässig alle DateTimes vergleichen können, indem Sie zuerst ToUniversalTime für jedes aufrufen. Diese Strategie schlägt fehl, wenn (und nur wenn) genau eines von ihnen eine DatTimeKind von" Unspecified "aufweist. Dieses Fehlerpotential ist ein anderes Grund für die Bevorzugung von DateTimeOffset "- C # 4.0 Kurz gesagt, O'Riely Bücher.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage