2008-08-01 68 views
519

निर्धारित करें क्या कोई वेब सर्वर किसी वेब पेज के भीतर उपयोगकर्ता के टाइमज़ोन को निर्धारित करने में सक्षम होने का कोई मानक तरीका है? शायद एक HTTP शीर्षलेख या उपयोगकर्ता-एजेंट स्ट्रिंग के हिस्से से?उपयोगकर्ता के टाइमज़ोन

+21

आप जॉन ईसाक्स के सही उत्तर को बनाने पर विचार कर सकते हैं ... उसका समाधान हल्का करने के लिए बहुत आसान है। – catphive

+4

उपयोगकर्ता से पूछें। यदि आपको उपयोगकर्ता के कंप्यूटर से समय क्षेत्र मिलता है, और यह गलत सेट है, तो क्या? –

+19

तो उपयोगकर्ता शायद परवाह नहीं करता है? – agnoster

उत्तर

73

कोई HTTP शीर्षलेख नहीं है जो अब तक क्लाइंट टाइमज़ोन की रिपोर्ट करेगा हालांकि इसे HTTP विनिर्देश में शामिल करने का सुझाव दिया गया है।

यदि यह मैं था, तो शायद मैं क्लाइंटसाइड जावास्क्रिप्ट का उपयोग करके टाइमज़ोन लाने की कोशिश करता हूं और फिर इसे अजाक्स या कुछ का उपयोग कर सर्वर पर सबमिट करता हूं।

+4

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

+0

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

+0

@MikkoRantalainen प्रॉक्सियों का उपयोग करते समय सावधान रहें, क्योंकि वे हमेशा शीर्षकों में विज्ञापन नहीं करते हैं। – Matthieu

46

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

भौगोलिक स्थान तक, मैंने कई परियोजनाओं पर MaxMind GeoIP का उपयोग किया है और यह अच्छी तरह से काम करता है, हालांकि मुझे यकीन नहीं है कि वे टाइमज़ोन डेटा प्रदान करते हैं या नहीं। यह एक सेवा है जिसके लिए आप भुगतान करते हैं और वे आपके डेटाबेस में मासिक अपडेट प्रदान करते हैं। वे कई वेब भाषाओं में रैपर प्रदान करते हैं।

+0

मैंने इस जवाब को वोट दिया है क्योंकि अक्षांश और देशांतर से जीओआईपी जैसे अक्षांश प्राप्त हुआ है (जिसमें अब एक मुफ्त संस्करण उपलब्ध है) उन डेटाबेसों के साथ जोड़ा जा सकता है जो इस तरह के एक समन्वय को समय क्षेत्र में परिवर्तित करते हैं। मुझे लगता है कि GeoNames के बाद का डेटाबेस है। –

+0

यह भी देखें [यह प्रश्न] (http://stackoverflow.com/questions/5584602)। –

+0

मैक्समिंड जियोआईपी डेटाबेस/एपीआई के मौजूदा संस्करण (दोनों मुफ्त और भुगतान के लिए), वास्तव में टाइमज़ोन जानकारी प्रदान करते हैं (यह मेरे टाइमज़ोन के लिए "यूरोप/लंदन" देता है।) मुझे याद नहीं है कि उनके जियोआईपी का पुराना संस्करण क्या है सिस्टम ने वही किया, लेकिन यह अब बहुत अच्छा काम करता है! मैक्समाइंड फ़ील्ड को "time_zone", "time_zone_name" नाम दिया गया है। –

173

मेरे द्वारा देखे गए समय क्षेत्र को निर्धारित करने का सबसे लोकप्रिय (== मानक?) तरीका केवल उपयोगकर्ताओं से पूछता है। यदि आपकी वेबसाइट को सदस्यता की आवश्यकता है, तो यह उपयोगकर्ताओं के प्रोफ़ाइल डेटा में सहेजा जा सकता है। एनन उपयोगकर्ताओं के लिए, तिथियां यूटीसी या जीएमटी या कुछ ऐसे के रूप में प्रदर्शित की जा सकती हैं।

मैं एक स्मार्ट एलेक बनने की कोशिश नहीं कर रहा हूं। यह सिर्फ इतना है कि कभी-कभी कुछ समस्याओं में किसी भी प्रोग्रामिंग संदर्भ के बाहर बेहतर समाधान होते हैं।

+3

कोई उपयोगकर्ता किसी .ics फ़ाइल को डाउनलोड करने के बारे में क्या होता है जिसके पास उनके स्थान के लिए प्रारंभिक समय होना चाहिए (उदाहरण के लिए देश भर में 9-11am)? उन्हें यह कहना नहीं चाहिए कि उनका समय क्षेत्र क्या है। –

+0

इसे सही उत्तर के रूप में स्वीकार क्यों नहीं करें? Unkwntech द्वारा दिया गया जवाब गैर-आईई ब्राउज़र के लिए भी काम नहीं करता है। –

+19

@ इश्मीएल: लेकिन उपयोगकर्ता अंतरराष्ट्रीय स्तर पर यात्रा करते हैं और उन्हें प्रत्येक गैर-देशी टाइमज़ोन –

14

जादू सभी

visitortime.getTimezoneOffset() 

में होने की यह अच्छा है, मुझे लगता है कि के बारे में पता नहीं था लगता है। क्या यह आईई, आदि में काम करता है? वहां से आप जेएस का उपयोग AJAX, कुकीज़ सेट करने, जो कुछ भी करने में सक्षम होना चाहिए। मैं शायद कुकी मार्ग स्वयं जाऊंगा।

आपको उपयोगकर्ता को इसे बदलने की अनुमति देने की आवश्यकता होगी। हमने थोड़ी देर पहले ऐसा करने के लिए भौगोलिक स्थान (maxmind के माध्यम से) का उपयोग करने की कोशिश की, और यह अक्सर गलत था - इसे करने के लायक बनाने के लिए पर्याप्त नहीं है, इसलिए हम उपयोगकर्ता को इसे अपनी प्रोफ़ाइल में सेट करने दें, और उन उपयोगकर्ताओं को नोटिस दिखाएं जो अभी तक अपना सेट नहीं किया है। How to get the Country according to a certain IP?

स्पॉइलर:

16

किसी को भी किसी भी सेवा भौगोलिक स्थिति

खैर के लिए मैच आईपी, आप के लिए भाग्यशाली है कि इसका जवाब हमारे बहुत ही stackoverflow वेबसाइट पर पाया जा सकता है करेगा कि के बारे में पता: http://www.hostip.info/use.html

+0

मैं बस उस वेबसाइट पर गया और यह पूरी तरह से गलत था: -/ –

+0

@AdamLassek: संभवतः रोचक जानकारी, लेकिन क्या आप समझा सकते हैं क्यों? –

+0

@ AndréCaron यह कहता है कि मैं इरविन, सीए में हूं जब वास्तव में मैं वास्तव में ओमाहा, एनई में हूं। –

11

यदि आप प्रमाणीकरण के लिए OpenID का उपयोग कर रहे हैं, तो Simple Registration Extension हल होगा प्रमाणीकृत उपयोगकर्ताओं के लिए समस्या है (आपको tz से numeric में कनवर्ट करने की आवश्यकता होगी)।

एक और विकल्प उपयोगकर्ता एजेंट के देश वरीयता से समय क्षेत्र का अनुमान लगाएगा। यह कुछ हद तक कच्ची विधि है (एन-यूएस के लिए काम नहीं करेगा), लेकिन एक अच्छा अनुमान लगाता है।

298
-new Date().getTimezoneOffset()/60; 

getTimezoneOffset() GMT से अपना समय घटाना और मिनट की संख्या वापस आ जाएगी। तो यदि आप जीएमटी -8 में रहते हैं, तो यह 480 वापस आ जाएगा।इसे घंटों में रखने के लिए, 60 तक विभाजित करें। साथ ही, ध्यान दें कि साइन आपको जो चाहिए उसके विपरीत है - यह आपके समय क्षेत्र से जीएमटी की ऑफसेट की गणना कर रहा है, न कि आपके समय क्षेत्र का जीएमटी से ऑफसेट। इसे ठीक करने के लिए, बस -1 से गुणा करें।

संपादित

भी ध्यान रखें कि w3school का कहना है:

दिए गए मान डेलाइट सेविंग टाइम का उपयोग कर के व्यवहार की वजह से, एक निरंतर नहीं है। ,

It's About Time

संक्षेप में:

+1

है जो मुझे सबसे ज्यादा समझ में आता है। क्या इसका कोई कारण नहीं है जिसका उपयोग नहीं किया जाना चाहिए या हर किसी को समस्या की तुलना में समस्या को और अधिक कठिन बनाना है। – jordanstephens

+0

@jordanstephens मैं एक विशेषज्ञ नहीं हूं इसलिए मुझे नहीं पता कि ऐसी परिस्थितियां हैं जहां यह काम नहीं करेगा, लेकिन यह मेरे लिए ठीक काम करता है। –

+5

उन उपयोगकर्ताओं के बारे में क्या जो सेल फ़ोन का उपयोग करते हैं जिनमें जावास्क्रिप्ट समर्थन के बिना ब्राउज़र हैं? मुझे सवाल पसंद है, उपयोगकर्ता HTTP शीर्षलेख, उपयोगकर्ता एजेंट के बारे में पूछता है ... क्या यह कार्य सर्वर पक्ष को यथासंभव सटीक बनाने का कोई तरीका है? – Nischal

10

यहाँ एक लेख (स्रोत कोड के साथ) बताते हैं कि कैसे निर्धारित करने और एक ASP.NET (VB.NET, सी #) आवेदन में स्थानीय समय का उपयोग करने के लिए है वर्णित दृष्टिकोण जावास्क्रिप्ट getTimezoneOffset फ़ंक्शन पर निर्भर करता है, जो सत्र कुकी में सहेजा गया मान देता है और जीएमटी और स्थानीय समय के बीच समय मान समायोजित करने के लिए कोड-बैक द्वारा उपयोग किया जाता है। अच्छी बात यह है कि उपयोगकर्ता को समय क्षेत्र निर्दिष्ट करने की आवश्यकता नहीं है (कोड स्वचालित रूप से करता है)। इसमें अधिक शामिल है (यही कारण है कि मैं लेख से लिंक करता हूं), लेकिन प्रदान किया गया कोड इसे उपयोग करना वास्तव में आसान बनाता है। मुझे संदेह है कि आप तर्क को PHP और अन्य भाषाओं में परिवर्तित कर सकते हैं (जब तक आप एएसपी.नेट को समझते हैं)।

+1

लिंक मर चुका है। मुझे लगता है कि यह वैकल्पिक लिंक है: http://www.devproconnections.com/article/aspnet2/it-s-about-time-122778 – Gan

+1

आलेख यहां पीडीएफ फॉर्म के रूप में भी उपलब्ध है: https://app.box। कॉम/साझा/bfvvmidtyg –

+0

यूटीसी सर्वर समय को इस आलेख में वर्णित स्थानीय क्लाइंट टाइम में कनवर्ट करने की विधि गलत है। सर्वर पर यूटीसी टाइम्स को समायोजित करने के लिए मौजूदा क्लाइंट ऑफसेट का उपयोग करने से क्लाइंट लोकेशंस के लिए आधा साल गलत "स्थानीय" समय होगा, जो डेलाइट सेविंग टाइम का निरीक्षण करते हैं। इस परिदृश्य पर विचार करें: यूके में 14 जनवरी 2013 (जीएमटी +0000 मानक समय) पर एक ग्राहक 21 अगस्त 2015 14:00 (जीएमटी +0100 डेलाइट टाइम) की तिथि और समय निर्धारित करता है। सर्वर पर 21 अगस्त 2015 13:00 यूटीसी को सामान्यीकृत किया जाता है। जिस दिन ऐसा होता है क्लाइंट ऑफ़सेट 0 होता है, इसलिए क्लाइंट को वापस भेजा गया समय 21 अगस्त 2015 13:00 होगा। –

16

PHP दिनांक फ़ंक्शन के साथ आपको सर्वर का दिनांक समय मिलेगा जिस पर साइट स्थित है। उपयोगकर्ता समय प्राप्त करने का एकमात्र तरीका जावास्क्रिप्ट का उपयोग करना है।

लेकिन मैं आपको सलाह देता हूं कि यदि आपकी साइट के पंजीकरण की आवश्यकता है तो अनिवार्य क्षेत्र के रूप में पंजीकरण करते समय उपयोगकर्ता से पूछना सबसे अच्छा तरीका है। आप रजिस्टर पेज में विभिन्न समय क्षेत्र सूचीबद्ध कर सकते हैं और डेटाबेस में सहेज सकते हैं। इसके बाद यदि उपयोगकर्ता साइट पर लॉगिन करता है तो आप उस सत्र के लिए डिफ़ॉल्ट समय क्षेत्र सेट कर सकते हैं जो उपयोगकर्ताओं के चयनित समय क्षेत्र के अनुसार होता है। आप PHP फ़ंक्शन date_default_timezone_set का उपयोग करके कोई विशिष्ट समय क्षेत्र सेट कर सकते हैं। यह उपयोगकर्ताओं के लिए निर्दिष्ट समय क्षेत्र सेट करें।

मूल रूप से उपयोगकर्ता का समय क्षेत्र क्लाइंट पक्ष पर जाता है, इसलिए हमें इसके लिए जावास्क्रिप्ट का उपयोग करना होगा।

नीचे PHP और जावास्क्रिप्ट का उपयोग कर उपयोगकर्ताओं का समय क्षेत्र प्राप्त करने के लिए स्क्रिप्ट है।

<?php 
#http://www.php.net/manual/en/timezones.php List of Time Zones 
function showclienttime() 
{ 
    if(!isset($_COOKIE['GMT_bias'])) 
    { 
    ?> 
    <script type="text/javascript"> 
    var Cookies = {}; 
    Cookies.create = function (name, value, days) { 
     if (days) { 
     var date = new Date(); 
     date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 
     var expires = "; expires=" + date.toGMTString(); 
     } else { 
     var expires = ""; 
     } 
     document.cookie = name + "=" + value + expires + "; path=/"; 
     this[name] = value; 
    } 

    var now = new Date(); 
    Cookies.create("GMT_bias",now.getTimezoneOffset(),1); 
    window.location = "<?php echo $_SERVER['PHP_SELF'];?>"; 
    </script> 
    <?php 
    } else { 
    $fct_clientbias = $_COOKIE['GMT_bias']; 
    } 

    $fct_servertimedata = gettimeofday(); 
    $fct_servertime = $fct_servertimedata['sec']; 
    $fct_serverbias = $fct_servertimedata['minuteswest']; 
    $fct_totalbias = $fct_serverbias – $fct_clientbias; 
    $fct_totalbias = $fct_totalbias * 60; 
    $fct_clienttimestamp = $fct_servertime + $fct_totalbias; 
    $fct_time = time(); 
    $fct_year = strftime("%Y", $fct_clienttimestamp); 
    $fct_month = strftime("%B", $fct_clienttimestamp); 
    $fct_day = strftime("%d", $fct_clienttimestamp); 
    $fct_hour = strftime("%I", $fct_clienttimestamp); 
    $fct_minute = strftime("%M", $fct_clienttimestamp); 
    $fct_second = strftime("%S", $fct_clienttimestamp); 
    $fct_am_pm = strftime("%p", $fct_clienttimestamp); 
    echo $fct_day.", ".$fct_month." ".$fct_year." (".$fct_hour.":".$fct_minute.":".$fct_second." ".$fct_am_pm.")"; 
} 

showclienttime(); 
?> 

लेकिन मेरे दृष्टिकोण के मुताबिक, यदि आपके प्रोजेक्ट में पंजीकरण अनिवार्य है तो उपयोगकर्ताओं से पूछना बेहतर होगा।

33

यहां एक और पूरा तरीका है।

  1. समय क्षेत्र उपयोगकर्ता
  2. टेस्ट डीएलएस सीमाओं पर कुछ दिनों अगर वे एक क्षेत्र डीएलएस का उपयोग करता है में हैं यह निर्धारित करने के लिए ऑफसेट हो जाओ।

नीचे छोड़कर:

function TimezoneDetect(){ 
    var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear()); 
    var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt 
    var intMonth; 
    var intHoursUtc; 
    var intHours; 
    var intDaysMultiplyBy; 

    //go through each month to find the lowest offset to account for DST 
    for (intMonth=0;intMonth < 12;intMonth++){ 
     //go to the next month 
     dtDate.setUTCMonth(dtDate.getUTCMonth() + 1); 

     //To ignore daylight saving time look for the lowest offset. 
     //Since, during DST, the clock moves forward, it'll be a bigger number. 
     if (intOffset > (dtDate.getTimezoneOffset() * (-1))){ 
      intOffset = (dtDate.getTimezoneOffset() * (-1)); 
     } 
    } 

    return intOffset; 
} 

Getting TZ and DST from JS (वे बैक मशीन के माध्यम से)

+0

यह मेरे लिए काम किया! कोड के दो अपडेट के लिए ब्लॉग पोस्ट के तहत टिप्पणियां पढ़ें। – arlomedia

+0

यह अभी भी समय क्षेत्र के लिए * मानक ऑफ़सेट * वापस करेगा, जैसे +02: 00। यह आपको 'अफ्रीका/जोहान्सबर्ग' या 'यूरोप/इस्तांबुल' जैसे उपयोगकर्ता के * समय क्षेत्र * को निर्धारित करने के लिए पर्याप्त जानकारी नहीं देगा। [टाइमज़ोन टैग विकी] देखें (http://stackoverflow.com/tags/timezone/info)। –

26

Unkwntech के दृष्टिकोण का उपयोग करना, मैं एक समारोह jQuery और PHP का उपयोग लिखा था। यह परीक्षण किया जाता है, और काम करता है!

पीएचपी पृष्ठ है जहाँ आप एक चर के रूप में समय क्षेत्र करना चाहते हैं कर रहे हैं पर, कहीं पेज के शीर्ष के पास कोड के इस स्निपेट है:

<?php  
    session_start(); 
    $timezone = $_SESSION['time']; 
?> 

इस सत्र चर "समय" दिखाया जाएगा, जो हम अब बनाने वाले हैं।

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> 
इसके अलावा

में, jQuery नीचे, पेस्ट इस:

उसी पृष्ठ पर, में, आप के लिए सब से पहले jQuery शामिल जरूरत

<script type="text/javascript"> 
    $(document).ready(function() { 
     if("<?php echo $timezone; ?>".length==0){ 
      var visitortime = new Date(); 
      var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60; 
      $.ajax({ 
       type: "GET", 
       url: "http://domain.com/timezone.php", 
       data: 'time='+ visitortimezone, 
       success: function(){ 
        location.reload(); 
       } 
      }); 
     } 
    }); 
</script> 

आप कर सकते हैं या हो सकता है ध्यान नहीं दिया है, लेकिन आपको यूआरएल को अपने वास्तविक डोमेन में बदलने की जरूरत है।

एक आखिरी बात। आप शायद सोच रहे हैं कि बिल्ली timezone.php क्या है।

<?php 
    session_start(); 
    $_SESSION['time'] = $_GET['time']; 
?> 

इस सही ढंग से काम करता है, यह प्रथम पृष्ठ लोड होगा (timezone.php और बिंदु से ऊपर यूआरएल के साथ यह करने के लिए कहा जाता है एक नई फ़ाइल बनाना), JavaScript निष्पादित: ठीक है, यह केवल यह है , और पेज को फिर से लोड करें। फिर आप $ टाइमज़ोन चर को पढ़ने में सक्षम होंगे और इसे आपकी खुशी के लिए उपयोग करेंगे! यह वर्तमान/GMT समय क्षेत्र ऑफसेट (GMT -7) या जो भी समय क्षेत्र में हैं रिटर्न

+0

मुझे यह पसंद है, लेकिन मेरे पास ऐसा कुछ हो सकता है जो वर्तमान $ _SESSION ['time'] की जांच करता हो और केवल अलग-अलग –

+1

को लोड करने के लिए जावास्क्रिप्ट प्राप्त करें, इसे लॉक करने के बाद, इसे परिवहन के लिए एक सत्र से कुकी का उपयोग करना संभव है, PHP सत्र को बेअसर करने से आपके ऐप में मंदी हो सकती है। अधिकतम दक्षता के लिए, आप मूल्य को सत्र में कॉपी कर सकते हैं और कुकी को हटा सकते हैं ताकि इसे बाद के अनुरोधों में नहीं भेजा जा सके। – IMSoP

15

जावास्क्रिप्ट:।

function maketimus(timestampz) 
{ 
    var linktime = new Date(timestampz * 1000); 
    var linkday = linktime.getDate(); 
    var freakingmonths=new Array(); 

    freakingmonths[0]="jan"; 
    freakingmonths[1]="feb"; 
    freakingmonths[2]="mar"; 
    freakingmonths[3]="apr"; 
    freakingmonths[4]="may"; 
    freakingmonths[5]="jun"; 
    freakingmonths[6]="jul"; 
    freakingmonths[7]="aug"; 
    freakingmonths[8]="sep"; 
    freakingmonths[9]="oct"; 
    freakingmonths[10]="nov"; 
    freakingmonths[11]="dec"; 

    var linkmonthnum = linktime.getMonth(); 
    var linkmonth = freakingmonths[linkmonthnum]; 
    var linkyear = linktime.getFullYear(); 
    var linkhour = linktime.getHours(); 
    var linkminute = linktime.getMinutes(); 

    if (linkminute < 10) 
    { 
     linkminute = "0" + linkminute; 
    } 

    var fomratedtime = linkday + linkmonth + linkyear + " " + linkhour + ":" + linkminute + "h"; 
    return fomratedtime; 
}  

बस इस समारोह के लिए यूनिक्स टाइमस्टैम्प प्रारूप में अपने बार प्रदान करते हैं जावास्क्रिप्ट को पहले से ही जानता है उपयोगकर्ता का टाइमज़ोन।

इस तरह:

php:

echo '<script type="text/javascript"> 
var eltimio = maketimus('.$unix_timestamp_ofshiz.'); 
document.write(eltimio); 
</script><noscript>pls enable javascript</noscript>'; 

यह हमेशा बार सही ढंग से समय क्षेत्र व्यक्ति को अपने कंप्यूटर की घड़ी में स्थापित किया है के आधार पर दिखाई देगा, किसी को कुछ पूछना है और इसे बचाने के लिए कोई जरूरत नहीं स्थानों में भगवान का शुक्र है!

+0

$ unix_timestamp_ofshiz? यहां कुछ गुम है और काफी काम नहीं करता है, भले ही ऐसा लगता है कि यह एक अच्छा जवाब हो सकता है। –

11

यह करने के लिए एक आसान तरीका का उपयोग करना है:

new Date().getTimezoneOffset(); 
+5

आपने 2 साल पहले एक समान उत्तर (जॉन ईसाक्स द्वारा) को दोबारा क्यों पोस्ट किया था: http://stackoverflow.com/a/1809974/836407? – chown

+0

इसके अलावा, यह केवल * वर्तमान * समय क्षेत्र ऑफसेट देता है - * समय क्षेत्र * नहीं। [टाइमज़ोन टैग विकी] देखें (http://stackoverflow.com/tags/timezone/info)। –

7

यहाँ कैसे मैं यह कर रहा है। यह PHP के डिफ़ॉल्ट टाइमज़ोन को उपयोगकर्ता के स्थानीय टाइमज़ोन पर सेट करेगा। बस अपने सभी पृष्ठों के शीर्ष पर निम्न पेस्ट करें:

<?php 
session_start(); 

if(!isset($_SESSION['timezone'])) 
{ 
    if(!isset($_REQUEST['offset'])) 
    { 
    ?> 
     <script> 
     var d = new Date() 
     var offset= -d.getTimezoneOffset()/60; 
     location.href = "<?php echo $_SERVER['PHP_SELF']; ?>?offset="+offset; 
     </script> 
     <?php 
    } 
    else 
    { 
     $zonelist = array('Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/New_York' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Minsk' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00); 
     $index = array_keys($zonelist, $_REQUEST['offset']); 
     $_SESSION['timezone'] = $index[0]; 
    } 
} 

date_default_timezone_set($_SESSION['timezone']); 

//rest of your code goes here 
?> 
+1

यह "डेलाइट सेविंग" समायोजन के लिए खाता नहीं है - डबलिन में एक उपयोगकर्ता सर्दियों में आपके 'यूरोप/डबलिन' से मेल खाता है, लेकिन गर्मियों में 'यूरोप/बेलग्रेड' से मेल खाता है। यदि आप वर्तमान ऑफसेट का उपयोग करने जा रहे हैं, तो आप उचित रूप से मान सकते हैं कि ऑफसेट, भौगोलिक पहचानकर्ता नहीं है। – IMSoP

16

आसान, बस इतनी तरह जावास्क्रिप्ट getTimezoneOffset समारोह का उपयोग करें:

-new Date().getTimezoneOffset()/60; 
+1

यह एक जावास्क्रिप्ट फ़ंक्शन है, न कि एक PHP फ़ंक्शन। – cincodenada

+0

इसके अलावा, यह केवल * वर्तमान * समय क्षेत्र ऑफ़सेट देता है - * समय क्षेत्र * नहीं। [टाइमज़ोन टैग विकी] देखें (http://stackoverflow.com/tags/timezone/info)। –

7

इस php कोड

<?php 
$ip = $_SERVER['REMOTE_ADDR']; 
$json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true"); 
$json = json_decode($json,true); 
$timezone = $json['LocalTimeZone']; 
?> 
+0

ऐसा लगता है कि http://api.easyjquery.com/ अब उपलब्ध नहीं है – GingerPlusPlus

37

यहाँ है की कोशिश करो ब्राउजर में समय क्षेत्र निर्धारित करने के लिए एक मजबूत जावास्क्रिप्ट समाधान।

>>> var timezone = jstz.determine(); 
>>> timezone.name(); 
"Europe/London" 

https://bitbucket.org/pellepim/jstimezonedetect

+9

लिंक केवल उत्तर ही निराश हैं, क्योंकि यदि लिंक गायब हो जाता है, तो उत्तर उपयोगी हो जाता है; और क्योंकि लिंक का पालन किए बिना, पाठकों को यह नहीं पता कि यह एक अच्छा जवाब देता है या नहीं। इस मामले में, आप यह स्पष्ट कर सकते हैं कि यह एक तृतीय-पक्ष लाइब्रेरी है जो पहचान के लिए डेटाबेस-आधारित दृष्टिकोण लेती है, और शायद इसके संचालन के कुछ सिद्धांतों को समझा सकती है। – IMSoP

+1

यह! जाने का यह रास्ता है। सरल पुस्तकालय, सही ढंग से डीएसटी संभालती है। अन्य उत्तर डब्ल्यूटीएफ से भरे हुए हैं और कई डीएसटी नहीं करते हैं। – Dirbaio

+1

यह पुस्तकालय बहुत चालाक है। यह यूटीसी में वर्तमान ऑफसेट से पूछताछ करके काम करता है, फिर यूटीसी परिवर्तनों के ऑफसेट तक सेकेंड जोड़ने या घटाने के द्वारा जावास्क्रिप्ट डेट ऑब्जेक्ट टाइम समायोजित करता है। इस विधि का उपयोग इस लाइब्रेरी में समय-समय पर विशिष्ट रूप से पहचानने के लिए कई पर्याप्त डीएसटी परिवर्तन हैं। मुझे लगता है कि लाइब्रेरी में बेहतर प्रदर्शन हो सकता है अगर उसने रैखिक खोज के बजाय बाइनरी खोज की हो। वापसी मूल्य एक आईएएनए जोन जानकारी कुंजी (उर्फ ओलसन समय क्षेत्र डेटाबेस) है। –

18

मैं अभी भी एक विस्तृत जवाब यहाँ उस समय क्षेत्र हो जाता है नहीं देखा है। आपको आईपी पते से geocode की आवश्यकता नहीं है या PHP (lol) का उपयोग नहीं करना चाहिए या ऑफसेट से गलत अनुमान लगाना चाहिए।

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

यदि आप इस टाइमज़ोन को स्टोर करना चाहते हैं, उदाहरण के लिए उपयोगकर्ता प्राथमिकताओं में आप ज़ोन चाहते हैं और न केवल ऑफसेट चाहते हैं। रीयलटाइम रूपांतरणों के लिए इससे कोई फर्क नहीं पड़ता।

अब

, जावास्क्रिप्ट आप इस का उपयोग कर सकते के साथ समय क्षेत्र पाने के लिए:

https://github.com/scottwater/jquery.detect_timezone

: हालांकि मैं यह आसान बस जो ऑलसेन स्वरूपित समय क्षेत्र देता है इस मजबूत प्लगइन का उपयोग करने के लिए मिला

>> new Date().toTimeString(); 
"15:46:04 GMT+1200 (New Zealand Standard Time)" 
//Use some regular expression to extract the time. 

18

jQuery

$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     xhr.setRequestHeader("X-TZ-Offset", -new Date().getTimezoneOffset()/60); 
    } 
}); 
के साथ AJAX अनुरोधों पर एक HTTP शीर्षलेख के रूप में टाइमज़ोन ऑफ़सेट सबमिट करने के लिए

तुम भी http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/

+0

यह केवल * वर्तमान * समय क्षेत्र ऑफ़सेट देता है - * समय क्षेत्र * नहीं। [टाइमज़ोन टैग विकी] देखें (http://stackoverflow.com/tags/timezone/info)। –

+0

समय क्षेत्र के नाम के लिए ऐसा करने के बारे में जानकारी शामिल करने के लिए संपादित किया गया। – philfreo

14

से moment.tz.guess(); का उपयोग करके वास्तविक समय क्षेत्र का नाम पाने के लिए IP पते का उपयोग निश्चित स्थान (और hense समय क्षेत्र) निर्धारित करने के लिए नहीं है कुछ इसी तरह कर सकते हैं - कि क्योंकि नेट, प्रॉक्सी (तेजी के साथ है लोकप्रिय), और वीपीएन, आईपी पते जरूरी नहीं कि वास्तविक रूप से उपयोगकर्ता के वास्तविक स्थान को प्रतिबिंबित करें, लेकिन वह स्थान जिस पर प्रोटोकॉल लागू करने वाले सर्वर रहते हैं।

संख्या पोर्टेबिलिटी की लोकप्रियता के कारण, एक टेलीफोन उपयोगकर्ता का पता लगाने के लिए एरिया कोड अब उपयोगी नहीं हैं।

आईपी और ऊपर दिखाए गए अन्य तकनीक के लिए उपयोगी हैं जो उपयोगकर्ता समायोजित/सही कर सकते हैं।

16

सबसे पहले, समझें कि जावास्क्रिप्ट में समय क्षेत्र का पता लगाना अपूर्ण है। आप स्थानीय समय क्षेत्र एक विशेष तिथि और समय Date वस्तु का एक उदाहरण पर getTimezoneOffset प्रयोग करने के लिए ऑफसेट प्राप्त कर सकते हैं, लेकिन है कि एक पूर्ण IANA time zoneAmerica/Los_Angeles की तरह के रूप में काफी समान नहीं है।

  • अधिकांश आधुनिक ब्राउज़र ECMAScript Internationalization API की उनके क्रियान्वयन में समर्थन IANA समय क्षेत्र है, तो आप ऐसा कर सकते हैं:

    const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone; 
    

    परिणाम है

    कुछ विकल्प है कि हालांकि काम कर सकते हैं कर रहे हैं एक स्ट्रिंग जिसमें कंप्यूटर की आईएएनए समय क्षेत्र सेटिंग होती है जहां कोड चल रहा है।

    समर्थित वातावरण in the Intl compatibility table सूचीबद्ध हैं।DateTimeFormat अनुभाग का विस्तार करें, और resolvedOptions().timeZone defaults to the host environment नाम की सुविधा देखें।

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

    jsTimezoneDetect और moment-timezone दोनों में यह कार्यक्षमता है।

    // using jsTimeZoneDetect 
    var tzid = jstz.determine().name(); 
    
    // using moment-timezone 
    var tzid = moment.tz.guess(); 
    

    दोनों मामलों में, परिणाम केवल अनुमान के रूप में सोचा जा सकता है। अनुमान कई मामलों में सही हो सकता है, लेकिन उनमें से सभी नहीं।

    इसके अतिरिक्त, इन पुस्तकालयों समय-समय पर तथ्य यह है कि कई पुराने जावास्क्रिप्ट कार्यान्वयन वर्तमान डेलाइट बचत समय उनके स्थानीय समय क्षेत्र के लिए शासन की केवल बारे में जानते हैं प्रतिक्रिया करने के लिए अद्यतन किया जाना है। More details on that here.

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

वहाँ भी सब पर उपयोगकर्ता के कंप्यूटर की समय क्षेत्र सेटिंग पर निर्भर नहीं की पूरी तरह से अलग दृष्टिकोण है। इसके बजाय, यदि आप अक्षांश और देशांतर निर्देशांक एकत्र कर सकते हैं, तो आप one of these methods का उपयोग करके समय क्षेत्र में उन्हें हल कर सकते हैं। यह मोबाइल उपकरणों पर अच्छी तरह से काम करता है।

6

Date हेडर फ़ील्ड का उपयोग करने का एक संभावित विकल्प है, जिसे RFC 7231 में परिभाषित किया गया है और इसमें टाइमज़ोन शामिल होना चाहिए। बेशक, यह गारंटी नहीं है कि मूल्य वास्तव में ग्राहक का टाइमज़ोन है, लेकिन यह एक सुविधाजनक प्रारंभिक बिंदु हो सकता है।

+0

दुर्भाग्यवश, वह हेडर मुख्य रूप से प्रतिक्रियाओं के लिए डिज़ाइन किया गया है, अनुरोध नहीं: "एक उपयोगकर्ता एजेंट अनुरोध में दिनांक शीर्षलेख फ़ील्ड भेज सकता है, हालांकि आमतौर पर तब तक ऐसा नहीं करेगा जब तक कि यह सर्वर को उपयोगी जानकारी नहीं देता है।" मैंने अभी जांच की है, और फ़ायरफ़ॉक्स इसे नहीं भेजता है। – IMSoP

8

JS और PHP के साथ सरल:

हालांकि अपने आंतरिक घड़ी और/या समय क्षेत्र, सबसे अच्छा तरीका है मैं अब तक पाया जाता है, के साथ उपयोगकर्ता कर सकते हैं गंदगी ऑफसेट करने के लिए, new Date().getTimezoneOffset(); बनी हुई है। इसका गैर-आक्रामक, सिर-दर्द नहीं देता है और तीसरे पक्षों पर भरोसा करने की आवश्यकता को समाप्त करता है।

कहें कि मेरे पास एक तालिका users है जिसमें यूनिक्स टाइमस्टैम्प संग्रहीत करने के लिए फ़ील्ड date_created int(13) है;

एक ग्राहक creates a new account मानते हुए, डेटा post द्वारा प्राप्त होता है, और मैं ग्राहक की यूनिक्स टाइमस्टैम्प, नहीं सर्वर के साथ date_created columninsert/update की जरूरत है।

डालने/अद्यतन के समय टाइमज़ोन ऑफसेट की आवश्यकता होने के बाद, क्लाइंट फॉर्म सबमिट करने पर इसे अतिरिक्त $ _POST तत्व के रूप में पारित किया जाता है, इस प्रकार इसे सत्रों और/या कुकीज़ में स्टोर करने की आवश्यकता को समाप्त कर दिया जाता है, और कोई अतिरिक्त नहीं सर्वर या तो हिट करता है।

var off = (-new Date().getTimezoneOffset()/60).toString();//note the '-' in front which makes it return positive for negative offsets and negative for positive offsets 
var tzo = off == '0' ? 'GMT' : off.indexOf('-') > -1 ? 'GMT'+off : 'GMT+'+off; 

सर्वर tzo$_POST['tzo'] के रूप में प्राप्त करता है कहो;

$ts = new DateTime('now', new DateTimeZone($_POST['tzo']); 
$user_time = $ts->format("F j, Y, g:i a");//will return the users current time in readable format, regardless of whether date_default_timezone() is set or not. 
$user_timestamp = strtotime($user_time); 

date_created=$user_timestamp डालें/अपडेट करें।

जब date_created पुन: प्राप्त करने के लिए, आप तो जैसे टाइमस्टैम्प परिवर्तित कर सकते हैं:

$date_created = //get from db 
$created = date("F j, Y, g:i a",$date_created);//return it to the user or whatever 

अब, यह उदाहरण के लिए, एक की आवश्यकता के अनुसार हो सकता है जब यह एक first टाइमस्टैम्प डालने की बात आती है ... यह एक अतिरिक्त की बात आती है टाइमस्टैंप, या टेबल, आप भविष्य में संदर्भ के लिए उपयोगकर्ता तालिका में tzo मान डालने पर विचार करना चाहते हैं, या इसे सत्र या कुकी के रूप में सेट करना चाहते हैं।

पीएस लेकिन अगर उपयोगकर्ता टाइमज़ोन यात्रा करता है और स्विच करता है तो क्या होगा। जीएमटी +4 में लॉग इन, जीएमटी -1 तक तेजी से यात्रा करता है और फिर से लॉग इन करता है। अंतिम लॉगिन भविष्य में होगा।

मुझे लगता है ... हम बहुत ज्यादा सोचते हैं।

5

आप इसे क्लाइंट पर moment-timezone के साथ कर सकते हैं और सर्वर को मान भेज सकते हैं; नमूना उपयोग:,

1) जावास्क्रिप्ट के साथ getTimezoneOffset के माध्यम से ही मिनटों में ऑफसेट समयक्षेत्र मिलती है:

> moment.tz.guess() 
"America/Asuncion" 
+0

फ़ंक्शन का नाम इसकी सटीकता के बारे में सबकुछ बताता है ;-) – Legends

5

PHP में एक वैध TZ डाटाबेस समयक्षेत्र नाम हो रही प्रक्रिया दो चरणों में है। यह ऑफ़सेट सकारात्मक होगा यदि स्थानीय टाइमज़ोन यूटीसी के पीछे है और नकारात्मक है तो यह नकारात्मक होगा। तो आपको ऑफ़सेट में एक विपरीत संकेत जोड़ना होगा।

var timezone_offset_minutes = new Date().getTimezoneOffset(); 
timezone_offset_minutes = timezone_offset_minutes == 0 ? 0 : -timezone_offset_minutes; 

इस ऑफसेट को PHP में पास करें।

2) PHP में इस ऑफ़सेट को timezone_name_from_abbr फ़ंक्शन के साथ वैध टाइमज़ोन नाम में परिवर्तित करें।

// Just an example. 
$timezone_offset_minutes = -360; // $_GET['timezone_offset_minutes'] 

// Convert minutes to seconds 
$timezone_name = timezone_name_from_abbr("", $timezone_offset_minutes*60, false); 

// America/Chicago 
echo $timezone_name;

मैं इस पर एक ब्लॉग पोस्ट में लिखा है: http://usefulangle.com/post/31/detect-user-browser-timezone-name-in-php यह भी एक डेमो में शामिल है।