Où définir une valeur de date et heure UTC dans une application n-tier: couche de présentation, domaine ou database?

Cela semble être une question évidente, mais j'ai eu quelques problèmes à find une bonne réponse. Je construis une application n-tier qui doit être sensible au time UTC. Les valeurs peuvent être mises à jour et lorsqu'elles sont des horodatages sont enregistrées. Cela inclut les transactions dans la database dans lesquelles les mises à jour ou les insertions auront un impact sur les colonnes datetime.

Pour donner du context, j'utilise SQL 2008 R2 + avec DATETIMEOFFSET (2) pour la plupart de mes colonnes datetime. J'envisage de mettre les mises à jour des horodatages dans les procédures stockées afin qu'elles n'aient pas besoin d'être transmises par le réseau. Cela économisera de la bande passante au fur et à mesure que le système se développera, ce qui est une bonne chose … et peut être utilisé pour valider si datatables changent (premières victoires) sur datatables partagées. L'inconvénient est que le premier à soumettre une transaction peut ne pas être celui qui gagne s'il rencontre un time de réponse plus lent sur son instance de l'application.

Quelle est la méthode idéale ou recommandée pour gérer datatables temporelles UTC dans ce context?

  1. Définissez-le dans le SPROC avec SYSUTCDATETIME () OR …
  2. Définissez-le dans l'application avec DateTimeOffset.Now ou DateTime.UtcNow

Dans les deux cas ci-dessus, est-il recommandé de triggersr le process au niveau du calque de présentation et de le passer par le service à la couche de domaine ou de le définir lorsqu'il atteint le domaine situé à l'arrière du service?

Comme vous pouvez le voir, il y a beaucoup d'options ici et je penche vers la database … mais j'apprécierais tous les conseils ou les mots d'avertissement avant de continuer à build cette chose.

Note de côté: Je suis également en train de suivre les informations géospatiales … mais ce n'est pas un système dur en time réel. L'user en time réel est plus que suffisant.

MISE À JOUR: j'utiliserai DateTimeOffset dans l'application. Ma search m'a conduit à découvrir que vous pouvez comparer de manière fiable n'importe quel DateTimes en appelant d'abord ToUniversalTime sur chacun d'entre eux Cette stratégie échoue si (et seulement si) exactement l'un d'entre eux a un DatTimeKind de "Unspecified". raison de favoriser DateTimeOffset "- C # 4.0 Dans un bref, O'Riely livres.

Je vote pour le définir dans la procédure (ou la valeur par défaut pour la colonne, pour les insertions). Il n'y a aucune raison de passer toutes ces informations à travers toutes les couches sauf si vous avez besoin d'une précision de l'ordre de la microseconde pour différencier, par exemple, lorsque l'user a cliqué sur le button ou lorsque la transaction a été validée dans la database. Cela est particulièrement vrai si vous avez une application dissortingbuée: voulez-vous vous assurer que tous vos servers Web / applications sont synchronisés, sans parler des posts de travail des users finaux pour les applications client / server? Vous pouvez avoir des servers dans différents centres de données, tous avec des fuseaux horaires différents, certains observant l'heure d'été, d'autres non, etc. DateTime.UtcNow devrait effacer la plupart de ces différences, mais je reviendrai toujours à transmettre toutes ces données sans raison. La database sait quelle heure il est; laissez-le stocker la valeur pour vous et gardez toute cette logique hors de l'application.

(Aussi, si vous stockez l'heure UTC, avez-vous vraiment besoin de DATETIMEOFFSET ? Si oui, alors vous avez encore besoin d'un moyen pour que la procédure sache dans quel timezone proviennent ces informations, sinon vous devriez probablement utiliser SMALLDATETIME/DATETIME/DATETIME2 fonction de la précision requirejse.)