Quelle est la meilleure façon de détecter et de stocker le fuseau horaire dans lequel se trouve le client d'une application Web?

J'ai une application Web multi-fuseaux horaires qui stocke toutes les valeurs de date et heure dans la base de données, lorsque des actions se produisent sur le serveur, je peux facilement convertir le temps en UTC.

Cependant, lorsqu'un client entre dans un intervalle de temps ou de temps, quel est le meilleur moyen de le détecter et de le stocker?

Je fais actuellement ce qui suit:

  1. Obtenez la valeur de Date.getTimezoneOffset () (javascript)
  2. Postez cela au code côté serveur via ICallbackEventHandler sur la page.
  3. Conservez cette valeur dans la session
  4. Sur toute demande ultérieure, calculez la valeur de la date / heure de sortie / entrée en utilisant le fuseau horaire du client.

Indépendamment de la mise en œuvre effective, cela semble être une solution élégante. Est-ce que quelqu'un a une meilleure méthode?

Je faisais quelque chose de très similaire, mais je pense maintenant que je préfère utiliser javascript pour convertir tous les temps en local du côté client. Le serveur donnera toutes les heures en UTC dans la page générée, et le javascript le convertira une fois que la page sera chargée.

Cela élimine la confusion sur le code côté serveur, car je sais toujours à quelle heure il est (UTC). Du côté du client, j'utilise jquery et la fonction each () pour formater toutes les valeurs du temps à la fois. J'écris chaque fois comme un temps unix dans un champ caché pour rendre cela facile à traiter avec jquery.

Les seuls problèmes que je vois avec cette méthode sont les suivants: a) Je n'ai pas encore une véritable bonne mise en forme de date / heure en javascript, et b) si l'utilisateur a désactivé javascript, cela ne fonctionne pas.

Vous pouvez utiliser la propriété "en-tête" de l'objet HttpRequest pour interroger l'en-tête "If-Modified-Since" envoyé par le client. Cet en-tête devrait contenir une date dans un format qui inclut le fuseau horaire du client, comme ceci:

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT 

Une simple extraction de sous-chaîne vous donnera le code fuseau horaire. Cependant, je crains que tous les navigateurs ne soient cohérents dans l'envoi de cet en-tête, donc vous devriez expérimenter un peu à ce sujet.

Cordialement, Fabrizio