2008-11-19 1 views
1

Je suis probablement en train de faire quelque chose de mal - mais ne peux pas comprendre pourquoi. J'ai un champ DateTime dans mon DB en gardant une heure UTCPourquoi LocalTime affiche l'heure du serveur et non l'heure du navigateur?

Mon serveur est aux États-Unis, et le navigateur est en Europe.

Le code PageLoad est comme suit:

DateTime t = DateTime.SpecifyKind((DateTime)rdr["startTime"], DateTimeKind.Utc); 
label1.Text = t.ToLocalTime().ToString(); 

Le temps affiché que je reçois est US localtime et non l'Europe. Que dois-je faire pour afficher l'heure locale du navigateur?

Merci!

Répondre

4

Une technique consiste à détecter le fuseau horaire du client décalage (en minutes) en utilisant javascript sur le navigateur client:

alert((new Date()).getTimezoneOffset(); 

Cela peut ensuite être renvoyé au serveur et stockées dans la session ou un cookie et utilisé pour compenser les dates UTC qui leur sont affichées. Alternativement, une autre technique consiste à avoir des profils d'utilisateur où ils peuvent spécifier leur fuseau horaire.

3

ToLocalTime est exécuté sur votre serveur, pas le navigateur. Si vous voulez convertir les dates côté serveur, vous devez obtenir le fuseau horaire de l'utilisateur (il y a au moins 3 fuseaux horaires ici en Europe, 6 si vous comptez l'heure d'été ....)

One L'approche consiste à envoyer les heures UTC au client, puis à utiliser le javascript pour le convertir en heure locale des utilisateurs (l'objet Date en javascript connaît le système d'utilisateurs défini)

1

En tant que some wrote, le code est en cours exécuté sur le serveur - il est donc logique que le fuseau horaire appliqué soit celui qui est local au serveur.

En plus de sa suggestion d'envoyer UTC au navigateur (ce qui est bien quand il est disponible, mais n'est pas toujours une option), vous devriez regarder dans TimeZoneInfo si vous utilisez .NET 3.5. Cela vous permettra de convertir entre UTC et les fuseaux horaires arbitraires, y compris les changements historiques. (Il y a beaucoup plus à timezones que juste « GMT + 5 », etc.) La grande difficulté travaille ce fuseau horaire où l'utilisateur est en fait. Vous pouvez généralement obtenir le courant de décalage par rapport à UTC avec JavaScript, mais cela ne vous donne pas toutes les informations dont vous avez besoin pour bien faire les choses. Tôt ou tard, vous devrez peut-être définir un paramètre par utilisateur pour le fuseau horaire dans lequel ils se trouvent.

1

Je ne pense pas qu'il soit judicieux de stocker des valeurs de temps dans votre base de données en fonction de l'heure à laquelle elles se trouvent dans le client. navigateur.

Si vous avez beaucoup de clients dans de nombreux fuseaux horaires et les informations stockées sont jamais collationné ou partagé - l'ordre des événements sera incorrect. 10:16 GMT est avant 10h30 heure de l'Est des États-Unis, par exemple.

Pour cette raison, il est préférable d'utiliser le temps du serveur (ou mieux encore comme cela a été dit par les autres - essayer d'utiliser UTC).

+0

Mon conseil est d'utiliser toujours UTC, surtout si l'heure locale ont un gain de temps d'été/jour. Avec UTC chaque moment a une valeur unique et il est facile de calculer le temps entre deux dates. Et quand vous voulez un temps loacal, utilisez simplement la bonne requête ou convertissez-la chez le client. – some

Questions connexes