2013-08-08 6 views
7

मैं ऐसी वेबसाइट विकसित कर रहा हूं जहां मुझे उपयोगकर्ताओं से अलग-अलग संभावित समय क्षेत्र से निपटना होगा। यह एक बड़ी समस्या बन जाती है क्योंकि वेबसाइट नीलामी जैसी समय-नाजुक घटनाओं को होस्ट करती है।सर्वर और क्लाइंट के बीच टाइमज़ोन से कैसे निपटें?

सर्वर पर सभी तिथियां/समय यूटीसी में हैं। डाटाबेस यूटीसी टाइमस्टैम्प में सबकुछ स्टोर करता है। PHP डिफ़ॉल्ट टाइमज़ोन यूटीसी पर भी सेट है (date_default_timezone_set('UTC');)।

अब, मेरी समस्या यह है कि मुझे उपयोगकर्ताओं के साथ कैसे बातचीत करनी चाहिए, चाहे मैं केवल एक तारीख दिखा रहा हूं या अधिक महत्वपूर्ण, मैं उपयोगकर्ता इनपुट से दिनांक/समय पढ़ रहा हूं।

एक ठोस उदाहरण:

  • एक नीलामी एक समय सीमा है, जो मैं यूटीसी के रूप में डेटाबेस में स्टोर है।
  • जब मैं वेबसाइट पर नीलामी देखता हूं, तो जावास्क्रिप्ट टाइमर शेष समय की गणना करने के लिए Date ऑब्जेक्ट का उपयोग करता है। यह स्वचालित रूप से टाइमज़ोन को जीएमटी +0100 (मेरे स्थानीय टाइमज़ोन) में परिवर्तित करता है। तो यदि समय सीमा '2013-08-08 10:46:08' (यूटीसी) है, तो जावास्क्रिप्ट दिनांक वस्तु Aug 08 2013 11:26:15 GMT+0100 (GMT Standard Time) वापस आ जाएगी।
  • यदि वर्तमान समय 11:46:08 से अधिक है तो टाइमर कहता है कि शेष समय 00:00 (जो सही है) है। बोलियां ... कहां ... और auction_deadline> जांच

    सम्मिलित करें NOW() ...

    :
  • लेकिन अगर मैं एक बोली सम्मिलित करने का प्रयास करें, सर्वर MySQL INSERT पर शर्त के बाद से स्वीकार करता है true का मूल्यांकन

(क्योंकि auction_deadline = '2013-08-08 10:46:08' और अब() = '2013-08-08 10:26:50')

सभी समय क्षेत्र के इस जम्बो मेरे दिमाग पिघला देता है। मुझे यहां क्या समझ नहीं आ रहा है? मैं लगभग निश्चित हूं कि डेटाबेस के अंदर यूटीसी में सभी तिथियों/समय को संग्रहीत करना सबसे अच्छा है। मैं सिर्फ क्रिस्टल को नहीं सोच सकता कि उपयोगकर्ता और डेटाबेस के बीच इसका सौदा कैसे किया जाता है।

+0

यदि आपको मेरे प्रश्न को स्पष्ट करने के लिए कुछ कोड चाहिए, तो कृपया इसे कहें। –

उत्तर

3

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

वास्तव में, आपको दिनांक वस्तुओं की भी आवश्यकता नहीं है। नीलामी समाप्त होने पर समय में एक निश्चित सार्वभौमिक तत्काल होता है। मान लें कि यह 1375960662823 है। अभी, समय में सार्वभौमिक तत्काल 1375960669199 है, इसलिए हम देखते हैं कि नीलामी 6 सेकंड (1375960662823 - 1375960669199 ~ 6000) में समाप्त होती है। अगर मैं मोरक्को या जापान में हूं तो यह 6 सेकंड में खत्म हो जाएगा। क्या आप इसे अभी समझते हैं?

इन नंबरों, क्लाइंट की तरफ आप var now = Date.now() + skewFix कॉल कर सकते हैं उत्पन्न करने के लिए जहां skewFix सुधार मामले ग्राहक में लागू करने की जरूरत है कि समय तिरछा है या मैन्युअल रूप से गलत समय के लिए अपने कंप्यूटर सेट है।

पीएचपी में, आप के साथ जावास्क्रिप्ट में $now = time() * 1000;

0

आप क्या कर सकते हैं निम्नलिखित

एक बार पृष्ठ लोड होने पर उपयोगकर्ता की भरपाई समय क्षेत्र के साथ सर्वर पर एक ajax अनुरोध भेजें। आप निम्न कोड का उपयोग कर टाइमज़ोन ऑफसेट प्राप्त कर सकते हैं।

var curdate = new Date() 
var offset = curdate.getTimezoneOffset() 

ऑफसेट मिनट में टाइमज़ोन ऑफसेट है।

मुझे लगता है कि इससे मदद मिलेगी।

0

यह एक सामान्य विषय है जो अभी तक समझने के लिए बहुत ही जटिल है। सबसे पहले, आप डेलाइट सेविंग का जिक्र नहीं करते हैं। हाँ मैं तुम्हारा तनाव बढ़ा रहा हूँ :)।

अब देखते हैं कि हम यह कैसे कर सकते हैं। यूटीसी में समय बचाने से आपने अच्छा काम किया है। अब, मुझे उम्मीद है कि आपके पास पंजीकृत सदस्य हैं और प्रत्येक सदस्य के पास अपना पसंदीदा टाइमज़ोन सेट करने की क्षमता है, अन्यथा आप उन्हें सर्वर का टाइमज़ोन आधारित समय दिखाएंगे।

जब आप उपयोगकर्ता को "प्रारंभ समय" के माध्यम से यूटीसी समय को अपने समय में परिवर्तित करने के बाद उन्हें भेजना होगा, उसी तरह जब आप ब्राउज़र से TIME स्वीकार करते हैं तो यह उपयोगकर्ता कार्रवाई या जावास्क्रिप्ट हो जिसे आपको उस समय यूटीसी में परिवर्तित करने की आवश्यकता है उपयोगकर्ता वह समय क्षेत्र है जिसे वह अपनी प्रोफ़ाइल के लिए चुनता है।

आशा है कि आप कहां गलत हो रहे हैं इस विचार को स्पष्ट करें? कृपया दिन की रोशनी बचत के माध्यम से पढ़ें क्योंकि जब आप दूसरे तर्क के साथ आगे बढ़ते हैं तो यह भी एक महत्वपूर्ण भूमिका निभाएगा।

संपादित करें:

आप उपयोग कर सकते हैं जावास्क्रिप्ट का समय-क्षेत्र ऑफसेट, ऑटो प्रस्तुत करने और उसकी सेटिंग के आधार पर उपयोगकर्ता इनपुट के लिए।

0

हर जब आप clientside से तारीख मिलता है, आप यूटीसी तारीख यानी कन्वर्ट करने के लिए getUTC उपयोग कर सकते हैं:

var todayDate = new Date(); 

var todayDateInUTC = new Date(todayDate.getUTCFullYear(), todayDate.getUTCMonth(), todayDate.getUTCDate(), todayDate.getUTCHours(), todayDate.getUTCMinutes(), todayDate.getUTCSeconds()); 

तो सही से पहले आप, डेटाबेस के लिए बोली की तारीख सम्मिलित getUTC कार्यों का उपयोग परिवर्तित करने के लिए यह यूटीसी प्रारूप में है।

1

दिनांक स्थानीय समय क्षेत्र का उपयोग करता है यह उत्पन्न कर सकते हैं। आपको उपयोगकर्ता के लिए यूटीसी समय प्राप्त करना चाहिए और उसे सर्वर

new Date 
Thu Aug 08 2013 17:00:14 GMT+0530 (India Standard Time) 
(new Date("Thu Aug 08 2013 17:00:14")).toUTCString(); 
"Thu, 08 Aug 2013 11:30:14 GMT" 

यह सर्वर और क्लाइंट के बीच टाइमज़ोन समस्या को हल करेगा।

1

तुमने कहा

(क्योंकि auction_deadline = '2013-08-08 10:46:08' और NOW() = '2013-08-08 10:26:50')

MySQL में - NOW सर्वर के स्थानीय समय क्षेत्र (docs) में वर्तमान समय देता है।

शायद आपको UTC_TIMESTAMP जैसे कुछ चाहिए जो यूटीसी (docs) में वर्तमान समय लौटाता है।

इसके अलावा - आपको क्लाइंट जावास्क्रिप्ट से किसी भी इनपुट समय को स्वीकार नहीं करना चाहिए। केवल अपनी घड़ी पर भरोसा करें। जब कोई बोली लगाई जाती है, तो अपने सर्वर पर MySQL या PHP में समय का उपयोग करें। इसे इनपुट के रूप में स्वीकार न करें।

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