J'ai un site Web hébergé dans un fuseau horaire différent de celui des utilisateurs utilisant l'application. En plus de cela, les utilisateurs peuvent avoir un fuseau horaire spécifique. Je me demandais comment les autres utilisateurs et applications SO abordent cela? La partie la plus évidente est qu'à l'intérieur de la base de données, la date / l'heure sont stockées en UTC. Sur le serveur, toutes les dates / heures doivent être traitées en UTC. Cependant, je vois trois problèmes que j'essaie de surmonter:
Obtenir l'heure actuelle en UTC (résolu facilement avec
DateTime.UtcNow
).Extraire les dates / heures de la base de données et les afficher à l'utilisateur. Il y a potentiellement beaucoup d'appels pour imprimer des dates sur différentes vues. Je pensais à une couche entre la vue et les contrôleurs qui pourraient résoudre ce problème. Ou avoir une méthode d'extension personnalisée
DateTime
(voir ci-dessous). L'inconvénient majeur est qu'à chaque emplacement d'utilisation d'un datetime dans une vue, la méthode d'extension doit être appelée!Cela ajouterait également de la difficulté à utiliser quelque chose comme le
JsonResult
. Vous ne pourriez plus appeler facilementJson(myEnumerable)
, il faudrait que ce soit le casJson(myEnumerable.Select(transformAllDates))
. Peut-être qu'AutoMapper pourrait vous aider dans cette situation?Obtention de l'entrée de l'utilisateur (local à UTC). Par exemple, publier un formulaire avec une date nécessiterait de convertir la date en UTC avant. La première chose qui me vient à l'esprit est de créer une coutume
ModelBinder
.
Voici les extensions que j'ai pensé utiliser dans les vues:
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);
}
}
Je pense que gérer les fuseaux horaires serait une chose si courante étant donné que de nombreuses applications sont désormais basées sur le cloud, où l'heure locale du serveur pourrait être très différente du fuseau horaire prévu.
Cela a-t-il été résolu avec élégance auparavant? Y a-t-il quelque chose qui me manque? Les idées et les pensées sont très appréciées.
EDIT: Pour dissiper une certaine confusion, j'ai pensé ajouter quelques détails supplémentaires. Le problème à l'heure actuelle n'est pas de savoir comment stocker les heures UTC dans la base de données, mais plutôt le processus de passage de UTC-> Local et Local-> UTC. Comme le souligne @Max Zerbini, il est évidemment judicieux de mettre le code UTC-> Local dans la vue, mais est-ce DateTimeExtensions
vraiment la réponse? Lors de l'obtention des entrées de l'utilisateur, est-il judicieux d'accepter les dates comme heure locale de l'utilisateur (puisque c'est ce que JS utiliserait), puis d'utiliser a ModelBinder
pour transformer en UTC? Le fuseau horaire de l'utilisateur est stocké dans la base de données et est facilement récupéré.
ModelBinder
.