Question

Je travaille sur un " système de rappel en ligne " projet (ASP.NET 2.0 (C #) / SQL Server 2005)

Comme il s’agit d’un service de rappel qui enverra le courrier aux utilisateurs à une date donnée. Mais le problème est que les utilisateurs ne proviennent pas d'un pays spécifique, ils viennent du monde entier et de différents fuseaux horaires. Maintenant, lors de mon inscription, je demande le fuseau horaire des utilisateurs de la même manière que Windows demande notre fuseau horaire au moment de l'installation.

Mais je ne comprends pas si l'utilisateur a sélectionné (+5,30) ou un fuseau horaire, comment gérer ce fuseau horaire dans mon application asp.net. Comment travailler en fonction du fuseau horaire.

Et s'il vous plaît suggérer s'il existe un meilleur moyen de gérer les fuseaux horaires dans cette application?

Merci

Était-ce utile?

La solution

La première chose à faire est de vous assurer du fuseau horaire dans lequel se trouvent vos données. Je vous recommande de vous assurer que tout DateTime que vous stockez est stocké en heure UTC (utilisez la DateTime.ToUniversalTime () pour attrapez-le).

Lorsque vous devez stocker un rappel pour un utilisateur, vous devez connaître l'heure UTC actuelle, ajouter ou supprimer la différence de fuseau horaire de l'utilisateur et reconvertir cette nouvelle heure en heure UTC. C’est ce que vous souhaitez stocker dans la base de données.

Ensuite, lorsque vous souhaitez vérifier les rappels à envoyer, il vous suffit de rechercher dans la base de données les rappels à envoyer maintenant, conformément à l'heure UTC; obtenez essentiellement tous les rappels dont l'horodatage est avant le DateTime.Now.ToUniversalTime () .

Mettre à jour avec certaines spécificités relatives à la mise en œuvre: Vous pouvez obtenir une liste des fuseaux horaires à l'aide de la méthode TimeZoneInfo.GetSystemTimeZones () ; vous pouvez les utiliser pour afficher une liste de fuseaux horaires pour l'utilisateur. Si vous stockez la propriété Id à partir du fuseau horaire sélectionné, vous pouvez en créer une instance de classe TimeZoneInfo et calculer l'heure UTC pour une valeur de date / heure locale donnée:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("<the time zone id>");
// May 7, 08:04:00
DateTime userDateTime = new DateTime(2009, 5, 7, 8, 4, 0);
DateTime utcDateTime = userDateTime.Subtract(tzi.BaseUtcOffset);

Autres conseils

Je recommanderais de toujours utiliser l'heure UTC (GMT) côté serveur (dans code-behind, base de données, etc.) et de convertir l'heure de l'heure UTC en heure locale aux fins d'affichage. uniquement. Cela signifie que toutes les manipulations du temps - y compris gagner du temps dans la base de données, effectuer des calculs, etc.

Le problème est le suivant: comment votre code-behind sait-il quel est le fuseau horaire du navigateur client? Supposons que l'utilisateur saisisse une valeur de date / heure (telle que 12/30/2009 14:30 ) dans le formulaire et l'envoie au serveur. En supposant que l'utilisateur soumette l'heure locale, comment le serveur sait-il convertir cette valeur en UTC?

L’application peut demander à l’utilisateur de spécifier le fuseau horaire (et de l’enregistrer dans un cookie persistant ou une base de données), mais cela nécessite un effort supplémentaire de la part de l’utilisateur. Votre application doit donc implémenter la logique et les écrans correspondants. Il serait préférable que l'application puisse déterminer le fuseau horaire du client automatiquement .

J'ai résolu ce problème à l'aide de la fonction getTimezoneOffset de JavaScript, qui est la seule API capable d'indiquer au serveur la différence d'heure entre l'heure locale du client et l'heure GMT. S'agissant d'une API côté client, j'ai procédé comme suit: côté serveur, recherchez un cookie de session personnalisé contenant la valeur de décalage horaire et, s'il n'est pas disponible, rechargez la page (uniquement pendant les appels GET et non POST). avec une logique JavaScript ajoutée pour générer le décalage horaire et le sauvegarder dans le cookie. Du côté client, cela est presque transparent (une fois pendant la session, je recharge une page sur GET). Une fois le décalage défini dans le cookie, je l’applique aux fonctions de gestion de l’heure en fonction du sens de la conversion (heure UTC en heure locale ou heure locale en UTC).

Cela peut sembler un peu compliqué, et c’est vrai, mais après avoir écrit les fonctions d’aide, l’intégration de cette fonctionnalité sur le site consistait à effectuer un appel unique dans Page_Load (de pages nécessitant du temps conversion) et l’utilisation de routines de conversion de temps lors de l’envoi et de la récupération de valeurs de temps vers et depuis le navigateur. Voici un exemple d'utilisation:

using My.Utilities.Web;
...

// Derive the form class from BaseForm instead of Page.
public class WebForm1: BaseForm
{
...
private void Page_Load(object sender, System.EventArgs e)
{
  // If we only want to load the page to generate the time
  // zone offset cookie, we do not need to do anything else.
  if (InitializeLocalTime())
    return;

  // Assume that txtStartDate is a TextBox control.
  if (!IsPostback)
  {
     // To display a date-time value, convert it from GMT (UTC)
     // to local time.
     DateTime startDate = GetStartDateFromDB(...);
     txtStartDate.Text  = FormatLocalDate(startDate);
     ...
  }
  else
  {
     // To save a date-time value, convert it from local
     // time to GMT (UTC).
     DateTime tempDate  = DateTime.Parse(txtStartDate.Text);
     DateTime startDate = ConvertLocalTimeToUtc(tempDate);
     SaveStartDateInDB(startDate, ...);
     ...
  }
}
...
}

Si vous avez besoin de plus de précisions, consultez le c'est à propos du temps : Localiser l'heure dans ASP.NET Applications article (désolé, mais je n'ai pas de lien direct vers l'article sur le site de l'éditeur, puisque asp.netPRO restreint l'accès aux abonnés payants uniquement; il existe des liens vers des copies PDF, bien que). J'aimerais pouvoir publier un extrait de l'article, mais je ne veux pas violer les droits d'auteur. Cependant, voici un projet de création d'une bibliothèque d'assistance dotée de toutes les fonctionnalités et de la documentation nécessaires. (ignorez tout ce dont vous n’avez pas besoin).

MISE À JOUR: L’article a été mis en ligne avec le projet exemple par le nouvel éditeur ici .

Le problème avec toutes les réponses à ce jour est qu’elles ne tiennent pas compte de ce que Prashant essaie de réaliser. Si l'utilisateur de son système la veille du changement d'heure a un décalage de +12 et configure un rappel pour le lendemain, son décalage lorsque le rappel est censé être déclenché sera à la place de +13.

C’est pourquoi vous ne pouvez utiliser le décalage actuel que pour un événement en cours. Bien que je sois d’accord avec tout le monde, il convient que toutes les heures côté serveur (sauf éventuellement celles utilisées uniquement pour l’affichage) soient stockées au format UTC.

Vous pouvez également utiliser DateTimeOffset . structure au lieu de DateTime si vous utilisez Framework 2.0 ou une version ultérieure.

DateTimeOffset représente un point dans le temps par rapport à l'heure UTC. Il devrait donc être plus facile de travailler dans ce cas.

Il y a 2 étapes:

  • Détectez différents fuseaux horaires côté client à l'aide de Javascript:

    var dt = new Date();
    var diffInMinutes = -dt.getTimezoneOffset();
    
  • Ensuite, côté serveur, code C # pour convertir l'heure du serveur en heure du client en fonction du décalage du fuseau horaire détecté ci-dessus:

------------------------;

string queryStr = Request.QueryString["diffInMinutes"];
int diffInMinutes = 0;
if (Int32.TryParse(queryStr, out diffInMinutes))
{
    clientTime = serverTime.ToUniversalTime().AddMinutes(diffInMinutes);
}

En gros, tout ce que vous avez à faire est d’ajouter le décalage (heures + minutes) à l’heure locale saisie par l’utilisateur. Ajouter le décalage vous donne fondamentalement un DateTime dans le fuseau horaire UTC (GMT).

Il est généralement plus facile de normaliser toutes vos heures au format UTC, afin que votre logique d'application ne soit pas gérée par les décalages.

Cette page contient quelques bons exemples: http://msdn.microsoft .com / fr-us / library / bb546099.aspx

Le problème est que le décalage par rapport à UTC variera à différents moments de l’année - chaque fuseau horaire a ses propres règles. (J'ai appris cela à la dure en développant une application de planification de salle de réunion.)

On dirait qu'il existe un support intégré ici: http : //msdn.microsoft.com/en-us/library/system.timezoneinfo.converttime.aspx

Je ne l’ai pas essayé moi-même, mais il semble promettre la conversion correcte, en tenant compte de l’heure avancée.

Sinon, voici un outil commercial (coûteux) que j'ai utilisé: http: //www.worldtimeserver .com / time_zone_guide /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top