2008-12-03 18 views
27

क्या सर्वर पर अपना टाइमज़ोन ऑफसेट करने का कोई तरीका है, http पर अनुरोध में कुछ पढ़कर, क्लाइंट को सब कुछ भेजने और इसे सौदा करने के बजाय?क्या आप अनुरोध चर से टाइमज़ोन निर्धारित कर सकते हैं?

उत्तर

21

यह अधिक जटिल है लेकिन मुझे पहले इस परिदृश्य का सहारा लेना पड़ा क्योंकि मशीन और उपयोगकर्ता प्रोफ़ाइल सेटिंग्स कभी-कभी आपके आगंतुक की प्राथमिकताओं से मेल नहीं खाती हैं। उदाहरण के लिए, एक यूके विज़िटर आपकी साइट को अस्थायी रूप से ऑस्ट्रेलियाई सर्वर से एक्सेस कर रहा है।

  1. एक जियोलोकेशन सेवा का उपयोग करें (उदाहरण, MaxMind.com) के रूप में @balabaster ने सुझाव दिया, उनके IP मिलान क्षेत्र पाने के लिए (Global.Session_Start सबसे अच्छा है)। यह स्थानीय आईएसपी के लिए एक अच्छा मैच है, लेकिन एओएल के लिए इतना अच्छा नहीं है। सत्र कुकी में ऑफसेट स्टोर करें।

  2. या JavaScript का उपयोग समय क्षेत्र एक रूप प्रस्तुत करने के भाग के रूप में प्राप्त करने के लिए ऑफसेट/अनुप्रेषित जब उपयोगकर्ता साइट में प्रवेश करती है। यह ब्राउज़र का वर्तमान ऑफसेट है, लेकिन आगंतुक के पसंदीदा क्षेत्र की आवश्यकता नहीं है। इस मान का उपयोग डिफ़ॉल्ट के रूप में करें; एक और सत्र कुकी में स्टोर करें।

    
    <script type="text/javascript" language="JavaScript"> 
    var offset = new Date(); 
    document.write('<input type="hidden" id="clientTzOffset" name="clientTzOffset" value="' + offset.getTimezoneOffset() + '"/>'); 
    </script> 
    
  3. आगंतुक (अनाम उपयोगकर्ताओं के लिए) अपनी खाता प्रोफ़ाइल में एक लगातार कुकी के माध्यम से क्षेत्र और एक क्षेत्र अद्यतन करने के लिए (यदि प्रमाणीकृत) की अनुमति दें।

ओवरराइड सत्र मूल्यों से लगातार मूल्य # 3। आप लॉगिन करने से पहले समय प्रदर्शित करने के लिए प्रमाणीकृत उपयोगकर्ताओं के लिए एक ही लगातार कुकी स्टोर भी कर सकते हैं।

0

पेज अनलोड से पहले की किसी भी घटना में ... Request.ServerVariables। यदि आप अपने भौतिक टाइमज़ोन चाहते हैं तो आप अपने आईपी पते की जांच करें और भू-स्थान रूपांतरण टूल में आईपी का उपयोग करें।

मुझे यकीन है कि वहाँ एक और तरीका है आप यह कर सकते है अगर, इसलिए यदि आप समय क्षेत्र अपने कंप्यूटर के लिए कॉन्फ़िगर किया गया है की आवश्यकता होती है, यह एक जावास्क्रिप्ट के लिए पृष्ठ लोड के लिए इंतजार करना होगा नहीं कर रहा हूँ ...

+2

आज मैंने सुना है कि एचटी का सबसे लंबा संस्करण बनाने के लिए धन्यवाद। – DevelopingChris

+0

मुझे आश्चर्य हुआ कि मुझे ओस्लो, नॉर्वे के लिए स्थानीयकृत विज्ञापन क्यों मिले, जब भी मैंने अपने फोन पर ओपेरा मिनी के साथ नेट सर्फ किया, इससे पहले कि मुझे एहसास हुआ कि आईपी के भौगोलिक स्थान रूपांतरण के कारण आई है ... ऐसा होता है कि ओस्लो दो जोड़े जहां से मैं रहता हूं, समय क्षेत्र दूर :-) – Kaniu

+0

चैनचान: आप हमेशा इसके लिए मुझ पर भरोसा कर सकते हैं;) – BenAlabaster

5

चेक detect_timezone.js - एक बहुत अच्छा उपयोगकर्ता के समय क्षेत्र

+0

मैं विशेष रूप से सर्वर साइड समाधान की तलाश में हूं, ताकि मैं वास्तव में टाइमज़ोन के आधार पर अपने कैशिंग कोड में चीजें कर सकूं। यह आखिरकार मैंने जो भी इस्तेमाल किया, उसका एक समान समाधान है, और बैक एंड कोड को उतना ही परवाह नहीं है, लेकिन क्लाइंट अनुरोध के हिस्से के रूप में ऑफसेट प्राप्त करना अच्छा लगेगा। – DevelopingChris

+1

हां, आप भरोसेमंद नहीं कर सकते हैं। – Bozho

+0

यह विश्वसनीय नहीं है। हो सकता है कि उपयोगकर्ता ने अपने सिस्टम में गलत समय निर्धारित किया हो – shashwat

-1

का निर्धारण हम सर्वर साइड में करने के बजाय ग्राहक से मूल्य भेज नीचे कोड का उपयोग कर समय क्षेत्र प्राप्त कर सकते हैं काम करता है।

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; 
    } 

धन्यवाद ...

+0

क्या आपने कोशिश की है यह एक सर्वर पर यूटीसी पर सेट है और एक क्लाइंट आपके वास्तविक टाइमज़ोन पर सेट है। – DevelopingChris

+2

आपने मुझे अपने समय के परीक्षण के कुछ मिनट बर्बाद करने के लिए काफी चिंतित किया, लेकिन खेद है। गो फ़िश। दिलचस्प अवधारणा। यदि ब्राउज़र डिफ़ॉल्ट रूप से अनुरोध हेडर के साथ अपना स्थानीय समय भेज देंगे। – johnw182

+0

यह सर्वर के टाइमज़ोन को निर्धारित करने के लिए केवल एक चौराहे का तरीका प्रतीत होता है, जिसे अधिक आसानी से पूरा किया जा सकता है। –

0

वहाँ आपके समय क्षेत्र ऑफसेट, http से अधिक अनुरोध में कुछ पढ़ने के बजाय ग्राहक के लिए सब कुछ भेजने द्वारा, सर्वर साइड पर करने के लिए एक रास्ता है और इसे इससे निपटने देना?

यहाँ समाधान मैं के साथ आया है, जब मैं WCF वेब सेवाओं के साथ एक ही मुद्दा था:

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

असल में, मैं अपने जावास्क्रिप्ट/कोणीय उपयोगकर्ता के समय क्षेत्र निर्धारित करने के लिए कोड तो मिलता है, इस मूल्य को मेरी डब्ल्यूसीएफ वेब सेवाओं में से एक को पास करें।

सूचना कैसे मैं एक वेब सेवा है getListOfRecords जो एक पैरामीटर, समय क्षेत्र ऑफसेट मूल्य लेता है कहा जाता है।

$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; 
    }); 
} 

वहाँ से, मेरी सी # कोड डेटाबेस रिकॉर्ड में पढ़ता है, लागू होने वाला समय क्षेत्र यूटीसी DateTime मूल्यों के लिए ऑफसेट, और ग्राहक को देता है।

+0

मैं इस पर एक और झुर्रियों में भाग गया, जो इसे आगे जटिल करता है। यह डेलाइट सेविंग्स के लिए मेरे टाइमज़ोन में अगले दिसंबर के लिए वापसी की तारीखों को कैसे प्रबंधित करता है। अगर यह ऑफसेट का उपयोग करता है, तो कई टाइमज़ोन मिलते हैं, और उनमें से अधिकतर डेलाइट सेविंग्स का उपयोग नहीं करते हैं। – DevelopingChris

संबंधित मुद्दे

 संबंधित मुद्दे