2008-12-03 7 views

Répondre

21

Cette est plus compliqué mais j'ai dû recourir à ce scénario auparavant car les paramètres de profil machine et utilisateur ne correspondent parfois pas aux préférences de votre visiteur. Par exemple, un visiteur britannique accédant temporairement à votre site à partir d'un serveur australien.

  1. utiliser un service de géolocalisation (par exemple MaxMind.com) tel que suggéré par @balabaster, pour obtenir la zone correspondant à leur adresse IP (Global.Session_Start est le meilleur). C'est un bon match pour les FAI locaux, mais pas si bon pour AOL. Enregistrez le décalage dans un cookie de session. Ou utilisez JavaScript pour obtenir le décalage de fuseau horaire dans le cadre d'un formulaire de soumission/redirection lorsque l'utilisateur entre sur le site. C'est le décalage actuel du navigateur, mais n'est pas nécessairement la zone préférée du visiteur. Utilisez cette valeur par défaut; stocker dans un autre cookie de session.

    
    <script type="text/javascript" language="JavaScript"> 
    var offset = new Date(); 
    document.write('<input type="hidden" id="clientTzOffset" name="clientTzOffset" value="' + offset.getTimezoneOffset() + '"/>'); 
    </script> 
    
  2. permettent au visiteur de mettre à jour la zone via un cookie persistant (pour les utilisateurs anonymes) et un champ dans leur profil de compte (si elle est authentifiée).

La valeur persistante # 3 remplace les valeurs de session. Vous pouvez également stocker le même cookie persistant pour les utilisateurs authentifiés afin d'afficher les heures avant de se connecter.

0

Dans l'un des événements précédant la page Unload ... Request.ServerVariables. Si vous voulez leur fuseau horaire physique, vous vérifiez leur adresse IP et utilisez un outil de conversion IP vers géo-localisation.

Je ne sais pas s'il y a une autre façon, vous pouvez le faire, donc si vous avez besoin le fuseau horaire de leur ordinateur est configuré pour, il faudrait attendre la charge de page pour un javascript ...

+2

Merci d'avoir créé la plus longue version de Non que j'ai entendue aujourd'hui. – DevelopingChris

+0

Je me demandais pourquoi j'avais des publicités localisées pour Oslo, en Norvège, chaque fois que je naviguais sur Internet avec Opera Mini, avant que je me rende compte que cela était dû à la conversion de l'adresse IP en lieu géographique ... – Kaniu

+0

ChanChan: Vous pouvez toujours compter sur moi pour cela;) – BenAlabaster

5

Check detect_timezone.js - fait un très bon travail de déterminer le fuseau horaire de l'utilisateur

+0

Je suis spécifiquement à la recherche de solution côté serveur, de sorte que je peux réellement faire des choses dans mon code de mise en cache basé sur le fuseau horaire. C'est une solution similaire à ce que j'ai utilisé en fin de compte, et j'ai fait en sorte que le code du back end ne soit pas aussi important, mais ce serait bien de faire des offsets dans le cadre de la demande du client. – DevelopingChris

+1

hélas, vous ne pouvez pas le faire de manière fiable. – Bozho

+0

ce n'est pas fiable. Peut être que l'utilisateur a défini une heure incorrecte dans son système – shashwat

-1

Nous pouvons obtenir le fuseau horaire en utilisant le code ci-dessous dans le côté du serveur au lieu d'envoyer la valeur du client.

private TimeZoneInfo GetRequestTimeZone() 
    { 
     TimeZoneInfo timeZoneInfo = null; 
     DateTimeOffset localDateOffset; 
     try 
     { 
      localDateOffset = new DateTimeOffset(Request.RequestContext.HttpContext.Timestamp, Request.RequestContext.HttpContext.Timestamp - Request.RequestContext.HttpContext.Timestamp.ToUniversalTime()); 
      timeZoneInfo = (from x in TimeZoneInfo.GetSystemTimeZones() 
          where x.BaseUtcOffset == localDateOffset.Offset 
          select x).FirstOrDefault(); 
     } 
     catch (Exception) 
     { 
     } 
     return timeZoneInfo; 
    } 

Merci ...

+0

Avez-vous essayé ceci sur un serveur défini sur UTC et un client défini sur votre fuseau horaire réel. – DevelopingChris

+2

Vous m'avez intrigué assez pour perdre quelques minutes de mon temps à tester cela, mais désolé. Aller pêcher. Concept intéressant. Si les navigateurs enverraient simplement leur heure locale avec les en-têtes de demande par défaut. – johnw182

+0

Cela semble être simplement un moyen détourné de déterminer le fuseau horaire du serveur, ce qui peut être accompli beaucoup plus simplement. –

0

est-il un moyen de faire vos décalages de fuseau horaire sur le côté serveur, par lire quelque chose dans la demande sur http, au lieu d'envoyer tout au client et le laisser faire face à cela?

Voici la solution que je suis venu avec, quand j'eu le même problème avec les services Web WCF:

How to get a WCF Web Service to return DateTimes in user's local timezone

Fondamentalement, je reçois mon JavaScript/code angulaire pour déterminer le fuseau horaire de l'utilisateur, Transmettez cette valeur à l'un de mes services Web WCF.

Notez que j'ai un service Web appelé getListOfRecords qui prend un paramètre, la valeur de décalage de fuseau horaire.

$scope.loadSomeDatabaseRecords = function() { 

    var d = new Date() 
    var timezoneOffset = d.getTimezoneOffset(); 

    return $http({ 
     url: 'http://localhost:15021/Service1.svc/getListOfRecords/' + timezoneOffset, 
     method: 'GET', 
     async: true, 
     cache: false, 
     headers: { 'Accept': 'application/json', 'Pragma': 'no-cache' } 
    }).success(function (data) { 
     $scope.listScheduleLog = data.Results; 
    }); 
} 

A partir de là, mon code C# lit dans les enregistrements de base de données, applique ce décalage horaire UTC aux DateTime valeurs, et il retourne au client.

+0

J'ai rencontré une autre ride à ce sujet, ce qui le complique encore. Comment cela gère-t-il les dates de retour pour Décembre prochain dans mon fuseau horaire pour l'heure avancée. Si elle utilise juste offset, alors de nombreux fuseaux horaires correspondent, et la plupart d'entre eux n'utilisent pas Daylight Savings. – DevelopingChris