2011-03-18 20 views
16

के साथ जावास्क्रिप्ट उलटी गिनती को सिंक कैसे करें मैं एक ऐसी साइट का निर्माण कर रहा हूं जिसमें समय और कीमतें हैं जो टिकटें। जिस चीज के साथ मैं सबसे ज्यादा चिंतित हूं वह समय को सिंक कर रहा है ताकि यह सभी ग्राहकों के लिए यथासंभव सटीक हो।सर्वर समय

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

क्या क्लाइंट के जावास्क्रिप्ट समय और सर्वर समय को सिंक करने का कोई तरीका है, या क्या मुझे बस इस मामूली अंतराल से निपटना होगा?

यदि डेटा भेजने वाले सर्वर के बीच समय अंतर को सटीक रूप से मापने का तरीका था और इसे ग्राहक द्वारा प्राप्त और प्रस्तुत किया जा रहा था।

+0

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

उत्तर

17

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

var timeRemaining = [rendered on page load or queried by ajax]; // in milliseconds 
var endTime = new Date(new Date().getTime() + timeRemaining); 

// Put this in a setInterval, or however you currently handle it 
var countdown = (endTime.getTime() - new Date().getTime())/1000; 
+4

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

+0

मैं इसे समझ नहीं सकता कि आप समय के परिवर्तन की दर का क्या मतलब रखते हैं? जब सर्वर शेष समय की गणना करता है तो प्रतिक्रिया भेजें देरी के लिए देरी कहां भेजती है? –

+0

@ समय के परिवर्तन की डोगिग्नब दर का मतलब क्लाइंट पर 1 सेकंड सर्वर पर 1 सेकंड के समान है। – ian

1

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

यदि आप मिलीसेन्ड्स रेज़ोल्यूशन आपके लिए पर्याप्त हैं तो आप Date.getTime() का उपयोग कर सकते हैं।

+0

प्लस सर्वर और क्लाइंट सिस्टम घड़ियों में जो भी अंतर है, उसके लिए ऑफसेट भी है। –

0

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

var now = new Date(); 
var later = new Date(); 
// Set time for how long the cookie should be saved 
later.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); 
// Set cookie for the time zone offset in minutes 
setCookie("time_zone_offset", now.getTimezoneOffset(), later, "/"); 
// Create two new dates 
var d1 = new Date(); 
var d2 = new Date(); 
// Date one is set to January 1st of this year 
// Guaranteed not to be in DST for northern hemisphere, 
// and guaranteed to be in DST for southern hemisphere 
// (If DST exists on client PC) 
d1.setDate(1); 
d1.setMonth(1); 
// Date two is set to July 1st of this year 
// Guaranteed to be in DST for northern hemisphere, 
// and guaranteed not to be in DST for southern hemisphere 
// (If DST exists on client PC) 
d2.setDate(1); 
d2.setMonth(7); 
// If time zone offsets match, no DST exists for this time zone 
if(parseInt(d1.getTimezoneOffset())==parseInt(d2.getTimezoneOffset())) 
{ 
setCookie("time_zone_dst", "0", later, "/"); 
} 
// DST exists for this time zone – check if it is currently active 
else { 
// Find out if we are on northern or southern hemisphere 
// Hemisphere is positive for northern, and negative for southern 
var hemisphere = parseInt(d1.getTimezoneOffset())-parseInt(d2.getTimezoneOffset()); 
// Current date is still before or after DST, not containing DST 
if((hemisphere>0 && parseInt(d1.getTimezoneOffset())==parseInt(now.getTimezoneOffset())) || 
(hemisphere<0 && parseInt(d2.getTimezoneOffset())==parseInt(now.getTimezoneOffset()))) { setCookie("time_zone_dst", "0", later, "/"); } // DST is active right now with the current date else { setCookie("time_zone_dst", "1", later, "/"); } } 

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

PHP में आप PHP8.3 के बाद उपलब्ध टाइमज़ोन_नाम_from_abbr नामक एक नए फ़ंक्शन के साथ एक वैध समय क्षेत्र निकाल सकते हैं - यह या तो समय क्षेत्र संक्षेप या समय क्षेत्र ऑफ़सेट (सेकंड में) और डेलाइट सेविंग टाइम का संयोजन लेता है, - ध्यान दें कि उदाहरण के लिए कई "नकल" नाम हैं कि, "यूरोप

$time_zone_name = timezone_name_from_abbr(", -$_COOKIE['time_zone_offset']*60, $_COOKIE['time_zone_dst']); 

यह आपको, उपयोगकर्ता के लिए एक सही समय क्षेत्र का नाम दे देंगे अगर कुकीज़ में डेटा मान्य है: और हम बाद के संयोजन है/बर्लिन "और" यूरोप/ज़्यूरिख ", जिनके पास सटीक समय क्षेत्र सेटिंग्स (कम से कम अभी के लिए) हैं, और आप उनमें से एक को उचित ऑफसेट और डीएसटी चर के लिए प्राप्त कर सकते हैं। समय क्षेत्र नामों की सूची php.net पर समर्थित समय क्षेत्र की सूची में पाई जा सकती है।

किसी दिए गए समय क्षेत्र उपयोगकर्ता के समय क्षेत्र अब आप अंत में सही समय क्षेत्र के साथ तारीख तार बनाने के लिए PHP वर्गों DateTimeZone और दिनांक समय उपयोग कर सकते हैं के नाम के साथ साथ तिथि तार बनाना:

// Create time zone class 
$time_zone_class = new DateTimeZone($time_zone_name); 
// Create new date class with a given date 
// Notice that the provided date will be regarded as being in the 
// default time zone and converted accordingly 
$new_date = new DateTime(‘2007-02-14 15:30:00′, $time_zone_class); 
// Print date with the user’s time zone echo $new_date->format(‘Y-m-d H:i:s’); 

यही वह है!

स्रोत: http://togl.me/eE2

10

वहाँ ग्राहक की जावास्क्रिप्ट समय और सर्वर समय की datetimes सिंक करने के लिए एक तरीका है। मैंने एक पुस्तकालय लिखा जो यह करता है: ServerDate

यहाँ README का हिस्सा है:

आप ServerDate उपयोग कर सकते हैं के रूप में आप Date समारोह या उसके उदाहरणों में से एक है, जैसे प्रयोग करेंगे:

> ServerDate() 
"Mon Aug 13 2012 20:26:34 GMT-0300 (ART)" 

> ServerDate.now() 
1344900478753 

> ServerDate.getMilliseconds() 
22 

भी पाने के लिए एक नया तरीका नहीं है सर्वर की घड़ी की ServerDate के अनुमान की शुद्धता (मिलीसेकेंड में):

> ServerDate.toLocaleString() + " ± " + ServerDate.getPrecision() + " ms" 
"Tue Aug 14 01:01:49 2012 ± 108 ms" 

आप सर्वर की घड़ी और ब्राउज़र घड़ी के बीच का अंतर, मिलीसेकेंड में देख सकते हैं:

> ServerDate - new Date() 
39