Traitement de la façon dont MongoDB stocke DateTime lorsqu’il est utilisé avec un modèle de localisateur de services

Mon collègue et moi sums dans une impasse dans un débat et les consortingbutions des autres seraient grandement appréciées.

Nous utilisons le modèle de localisateur de services et une interface commune pour résumer tous nos access aux données afin de pouvoir facilement basculer entre différentes sources de données à mesure que nos besoins évoluent. Notre code d’appel n’indique pas où les données sont stockées ni comment. Il accède simplement aux données via le service qui lui est fourni à partir du registre de services.

Le problème dont nous débattons se produit lorsque nous avons des champs DateTime sur un object et les stockons dans une source de données MongoDB.

Ce que j’ai remarqué, c’est que lorsque nous avons un object en C # avec un DateTime, il apparaît comme l’heure correcte. Lorsque nous nous connectons à notre serveur MongoDB avec MongoVUE pour inspecter l’object, il indique l’heure correcte. Mais lorsque nous récupérons l’object, le DateTime est maintenant en UTC. Cela crée évidemment des problèmes lors de la comparaison d’un DateTime en mémoire avec celui d’un object extrait de la source de données MongoDB.

Je comprends que Mongo stocke DateTime en interne en tant qu’heure UTC. Je comprends même pourquoi il pourrait retourner UTC lorsque vous l’appelez.

Voici où le débat commence.

Il a été suggéré qu’il s’agissait simplement d’un problème esthétique et que d’un problème d’affichage des dates. Nous devrions donc simplement appeler .ToLocalTime dans la couche d’interface. Je ne suis pas d’accord et affirme que cela brise dangereusement les couches d’abstraction que nous avons créées lors de la mise en œuvre du modèle de localisation de service. Cela soulève également des questions concernant l’interaction avec ces heures de date en ce qui concerne le déclenchement d’autres événements.

Ce que j’ai lu ailleurs, c’est que nous devrions stocker nos heures sous forme de chaîne, plus précisément en tant que norme de format UTC. De cette manière, la couche d’interface ne sait pas ou ne se soucie pas de la manière dont le DateTime est stocké, pas plus que notre object, car chaque source de données stockerait cette chaîne de la même manière.

J’ai réussi à utiliser le format ISO 1806, mais mon collègue pense que c’est une solution miracle et que l’utilisation de .toLocalTime est le moyen approprié de gérer cette situation.

Je suis intéressé par ce que les autres ont à dire sur le sujet.

Merci d’avance pour votre consortingbution.

Pourquoi ne stockez-vous pas UTC dans la firebase database en premier lieu? Dans la plupart des cas, DateTime doit être stocké au format UTC, car il fait généralement référence à un moment précis. Ceci est vrai pour tout ce qui fait référence au temps dans un sens physique, et tout ce qui présume que le temps est monotone, croissant et unique, aucun d’entre eux n’étant vrai pour la plupart des temps locaux.

De temps en temps, utiliser les heures locales est logique: supposons qu’un bus part tous les jours à 9h. Cela signifie que 24 heures s’écoulent entre deux événements consécutifs. Toutefois, si le fuseau horaire a un heure d’heure, l’intervalle sera de 23h et de 25h une fois par an.

Cependant, si vous devez vous occuper de ce type de données, un simple DateTime ne fait pas l’affaire. Les règles DST peuvent changer, les fuseaux horaires peuvent changer, etc. En C #, les règles DST qui seront appliquées sont celles qui sont actuellement valides, même si la date est “historique”. L’arithmétique des dates avec des dates historiques peut donc faire des ravages. Si vous avez vraiment besoin de vous en sortir, vous devriez au moins enregistrer le fuseau horaire dans lequel se trouve l’heure (pas seulement l’offset, ni même un drapeau isLocal ).

Stocker des informations textuelles dans la firebase database pouvant être stockées en binary ne me semble pas très élégant, pas plus que la modification de la valeur dans une couche intermédiaire. Le premier est inefficace et souffre des particularités de l’heure locale mentionnées précédemment, le dernier n’a que le 2e problème.

BTW, pour accomplir ce dernier, vous pouvez décorer la propriété avec [BsonDateTimeOptions(Kind=DateTimeKind.Local)] , qui effectuera la conversion pour vous, mais souffre des mêmes problèmes, bien sûr.