22 votes

Le Fuseau Horaire De La Stratégie

Je suis la construction d'une application MVC 3, où les utilisateurs peuvent ne pas être dans le même fuseau horaire, donc mon intention était de stocker le tout dans l'UTC et de convertir l'heure UTC en heure locale dans les points de vue et localtime à l'UTC sur les présentations.

Faire un peu de navigation mais il ne semble pas y avoir beaucoup de bonnes solutions à cela. Pour être honnête, je sorte de s'attendre à un attribut à la disposition de l'auto de convertir l'heure UTC en heure locale, au moins, mais il semble ne pas exister.

J'ai envie de juste essayer d'être vigilants au sujet de la conversion manuellement chaque entrée à l'UTC et manuellement la conversion de chaque vue de l'affichage de l'heure locale va être très enclins à faire des erreurs et conduire à difficile à détecter les bugs où le temps n'est pas converti à la ou de.

Toutes les suggestions sur la façon de traiter cela comme une stratégie générale?

MODIFIER Tout le monde semble très coincé sur le "comment puis-je obtenir le fuseau horaire du client" pièce, qui, comme je le mentionne dans l'un des commentaires n'est pas ma préoccupation. Je suis fine avec un paramètre de l'utilisateur qui détermine leur fuseau horaire, de sorte que je sais déjà ce que le client fuseau horaire est...qui n'a pas l'adresse de mon problème.

Pour l'instant, sur chaque point de vue quand j'ai rendu un jour, j'aurais besoin d'appeler une méthode pour le rendre dans le fuseau horaire utc. Chaque fois que j'envoie une date pour la présentation du serveur, j'ai besoin de les convertir à ce que les locaux fuseau horaire UTC. Si j'oublie de le faire, il y aura des problèmes...soit une date sera mauvais ou côté client, des rapports et des filtres sera mauvais.

Ce que j'espérais, existait une méthode automatique, surtout depuis que le modèle de vue est fortement tapé dans MVC 3 j'ai été en espérant pour la somme de magie pour pouvoir au moins rendre automatiquement dans une zone de temps, si ce n'est la poignée de la présentation, tout comme le format de la date ou de la plage peut être contrôlé par un attribut.

Donc, comme

[DateRange]
Public DateTime MyDate

Je pourrais avoir quelque chose comme

[ConvertToUTC(offset)]
Public DateTime MyDate

De toute façon, je suppose qu'il ressemble à ma seule approche serait d'écrire une coutume annotation de données à afficher dans un fuseau horaire, et un remplacement sur le MVC 3 modèle liant de façon entrant les dates sont convertis à moins que je veux enrouler jamais de date dans un appel de méthode. De sorte que si quelqu'un a d'autres commentaires ou suggestions qu'elle sera l'une de ces deux options, je suis juste surpris quelque chose n'existe pas déjà pour ce faire.

Si je dois mettre en place une solution je ne manquerai pas de les publier.

Edit 2 Quelque chose comme Ceci http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx pour MVC 3 vues et les modèles de vue est ce que je suis à la recherche d'.

Montage Final J'ai marqué epignosisx réponse comme correcte, mais aussi un peu de commentaires à ajouter. J'ai trouvé quelque chose de similaire ici: http://dalldorf.com/blog/2011/06/mvc3-timezones-1/ Avec une mise en œuvre de l'obtention du fuseau horaire du client en le plaçant dans le cookie pour les gens qui veulent que dans la partie 2 (lien ci-dessous depuis le lien sur la première partie de l'article de la partie 2 ne fonctionne pas) http://dalldorf.com/blog/2011/09/mvc3-timezones-2/

Il est important de noter avec ces approches que vous DEVEZ vous Editfor et méthode displayfor au lieu de les choses comme TextForFor que seulement EditFor et méthode displayfor utiliser les fournisseurs de métadonnées utilisé pour dire MVC comment afficher la propriété de ce type sur le modèle. Si vous accédez au modèle des valeurs directement dans la vue (@Modèle.Madate) aucune conversion n'aura lieu.

4voto

epignosisx Points 3023

Vous pourriez traiter le problème de la conversion de l'UTC à l'utilisateur, heure locale, en utilisant le site web à l'échelle DisplayTemplate pour le type DateTime.

De votre point de Vue vous utilisez @Html.Méthode displayfor(n => n.MyDateTimeProperty)

Le deuxième problème est plus difficile à aborder. Pour convertir de l'utilisateur, heure locale, à l'UTC vous pourriez remplacer le DefaultModelBinder. Plus précisément, la méthode SetProperty. Voici une implémentation naïve qui illustre le point. Il ne s'applique que pour DateTime , mais pourrait facilement être étendu à DateTime?. Puis de le configurer en tant que par Défaut de votre classeur dans le monde.asax

public class MyDefaultModelBinder : DefaultModelBinder
{
    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
    {
        //special case for DateTime
        if(propertyDescriptor.PropertyType == typeof(DateTime))
        {
            if (propertyDescriptor.IsReadOnly)
            {
                return;
            }

            try
            {
                if(value != null)
                {
                    DateTime dt = (DateTime)value;
                    propertyDescriptor.SetValue(bindingContext.Model, dt.ToUniversalTime());
                }
            }
            catch (Exception ex)
            {
                string modelStateKey = CreateSubPropertyName(bindingContext.ModelName, propertyDescriptor.Name);
                bindingContext.ModelState.AddModelError(modelStateKey, ex);
            }
        }
        else
        {
            //handles all other types
            base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
        }
    }
}

2voto

csharptest.net Points 16556

D'abord c'est surtout un double de Comment puis-je déterminer un utilisateur web de fuseau horaire?, Je suis d'accord avec la majorité vote pour cette réponse:

Les plus populaires (=- =de série?) façon de déterminer la zone de temps j'ai vu autour est tout simplement de demander à l'utilisateur d'elle-même. Si votre site web nécessite un abonnement, ce qui pouvait être sauvé dans le profil des utilisateurs de données. Pour anon utilisateurs, les dates peuvent être affichées en heure UTC ou GMT ou certains tel.

Cela étant dit, l'approche la plus commune automatiquement le réglage de cette valeur est d'utiliser du javascript Date getTimezoneOffset(). Cela peut ensuite être feed-back sur le serveur par l'intermédiaire d'un cookie ou de la requête ajax et stockées avec le profil de l'utilisateur, de session ou un cookie.

En fin de compte, je pense toujours que vous devez autoriser les utilisateurs à modifier ce paramètre de sorte que vous pouvez déterminer non seulement le décalage UTC, mais le fuseau horaire et l'heure avancée de l'information ainsi.

Lors de la collecte des données des utilisateurs de la conversion et de l'UTC par DateTime devrait suffire. DateTimeOffset est grande lorsque le client est géré code; cependant, avec du pur html/javascript, il n'est vraiment pas à acheter de vous. En outre, les informations supplémentaires de DateTimeOffset n'est pas forcément nécessaire par la plupart des applications, à moins que vous l'intention de montrer aux autres utilisateurs les originaires informations de fuseau horaire.

J'ai envie de juste essayer d'être vigilants au sujet de la conversion manuellement chaque entrée à l'UTC et manuellement la conversion de chaque vue de l'affichage de l'heure locale sera très enclins à faire des erreurs et conduire à difficile à détecter les bugs où le temps n'est pas converti à la ou de.

Vous ne devrait pas dépendre de diligence pour corriger la date+heure de mise en forme et l'analyse. L' .NET framework doit gérer cela pour vous, pour commencer voir "Comment: Définir la Culture et la Culture de l'INTERFACE utilisateur pour ASP.NET Page Web de la Mondialisation".

Remarque finale

Franchement c'est une douleur dans le cou. Nous avons écarté la mise en œuvre il y a quelques années et a commencé à transférer tous date+heure de l'information en temps UTC, puis nous utilisons Javascript pour convertir l'heure locale et le format d'affichage. C'est vraiment le seul travail de modèle à mon humble avis.

1voto

Adam Heath Points 1775

Vous pouvez utiliser quelque chose comme MomentJS pour l'affichage des dates/heures. Aide à la mise en forme et l'heure locale.

0voto

Udayan B. Points 22

Ce n'est pas possible automatiquement, vous aurez à faire un travail manuel.

1 Si vous ne souhaitez pas stocker de l'utilisateur du fuseau horaire dans db

1.1 Sans masterpage: Comme csharptest.net utilisation suggérée java script getDateTimeOffset() pour obtenir le décalage horaire, réglez la valeur dans le cookie, écrire un module pour vérifier cookie si le cookie n'est pas présent insérer du code java script et cookie à l'aide du module.

1.2 l'Utilisation de masterpage: Même chose mais pas besoin de module d'écriture pour vérification.

2 Magasin de l'utilisateur du fuseau horaire en db (meilleure et la plus simple) Pas besoin d'utiliser le javascript pour obtenir le fuseau horaire convertir datetime selon le fuseau horaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X