J'ai un site web qui est hébergé dans un autre fuseau horaire que les utilisateurs à l'aide de l'application. En plus de cela, les utilisateurs peuvent avoir un fuseau horaire spécifique. Je me demandais comment les autres de SORTE que les utilisateurs et les applications de cette approche? Le plus évident, c'est que, à l'intérieur de la DB, la date/temps sont stockés au format UTC. Lorsque sur le serveur, toutes les dates/heures devraient être traitées dans l'heure UTC. Cependant, je vois trois problèmes que j'essaie de surmonter:
Obtenir l'heure courante au format UTC (résolu facilement avec
DateTime.UtcNow
).-
Tirant date/heure à partir de la base de données et d'afficher à l'utilisateur. Il y a potentiellement beaucoup d'appels à l'impression de dates sur les différents points de vue. Je pensais à un calque entre la vue et les contrôleurs qui pourrait résoudre ce problème. Ou d'avoir une méthode d'extension personnalisée sur
DateTime
(voir ci-dessous). Le principal inconvénient, c'est qu'à chaque emplacement de l'aide d'un datetime en vue, l'extension de la méthode doit être appelée!Cela permettrait également d'ajouter de la difficulté à l'aide de quelque chose comme l'
JsonResult
. Vous ne pouvez plus facilement appelJson(myEnumerable)
, il faudraitJson(myEnumerable.Select(transformAllDates))
. Peut-être AutoMapper pourrait aider dans cette situation? L'obtention d'entrée de l'utilisateur (du Local à l'UTC). Par exemple, l'Affichage d'un formulaire avec une date d'exiger la conversion de la date au format UTC avant. La première chose qui vient à l'esprit est la création d'une coutume
ModelBinder
.
Voici les extensions que je pensais de l'aide 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 le fait de traiter avec les fuseaux horaires qui serait une chose commune en considérant un grand nombre d'applications sont maintenant basés sur le cloud où l'heure locale du serveur pourrait être très différent que le temps prévu de la zone.
Cela a été élégamment résolu avant? Est-il quelque chose que je suis absent? Les idées et les pensées sont beaucoup apprécié.
EDIT: Pour effacer une certaine confusion, je pensais ajouter un peu plus de détails. La question maintenant n'est pas la façon de stocker UTC fois dans la db, c'est plus sur le processus d'aller de l'UTC->Local et Local->UTC. @Max Zerbini points, c'est évidemment intelligent de mettre de l'UTC->code Local dans la vue, mais en utilisant le DateTimeExtensions
vraiment la réponse? Lors de la prise d'entrée de l'utilisateur, est-il judicieux d'accepter dates que le local de l'utilisateur en temps (puisque c'est ce que JS serait de l'utiliser) et ensuite utiliser un ModelBinder
pour les transformer à l'UTC? Le fuseau horaire de l'utilisateur est stocké dans la base de données et il est facile de les récupérer.