2009-05-07 16 views
28

मैं "ऑनलाइन अनुस्मारक प्रणाली" प्रोजेक्ट (एएसपी.नेट 2.0 (सी #)/एसक्यूएल सर्वर 2005) पर काम कर रहा हूंASP.NET में समय क्षेत्र के साथ कैसे काम करें?

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

लेकिन मुझे यह नहीं मिल रहा है कि उपयोगकर्ता ने चुना है (+5.30) या कुछ टाइमज़ोन तो मेरे एएसपीनेट एप्लिकेशन में इस समय क्षेत्र को कैसे संभालें। टाइमज़ोन के अनुसार कैसे काम करें।

और कृपया सुझाव दें कि इस एप्लिकेशन में टाइमज़ोन को संभालने का कोई बेहतर तरीका है ??

धन्यवाद

+0

यह प्रश्न पुराना हो सकता है और एक स्वीकार्य उत्तर हो सकता है, लेकिन यह काफी व्यापक है और उत्तर केवल समस्या के एक पहलू को संबोधित करते हैं। उत्तर भी गलत है, क्योंकि अनुशंसित समाधान में डेलाइट सेविंग टाइम शामिल नहीं है, और 'टाइमज़ोनइन्फो' का उपयोग करता है - जो .NET 2.0 (जो इस प्रश्न की आवश्यकता के रूप में) में उपलब्ध नहीं था। मैं अनुशंसा करता हूं कि इस प्रश्न को बंद या हटा दिया जाए। –

उत्तर

27

पहली बात यकीन है कि जो समय क्षेत्र आपके डेटा में है बनाने के लिए है। मुझे यकीन है कि बनाने की सिफारिश करेंगे कि किसी भी दिनांक समय है कि आप की दुकान, UTC समय (DateTime.ToUniversalTime() का उपयोग यह की पकड़ पाने के लिए) में संग्रहीत किया जाता है ।

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

फिर, जब आप भेजने के लिए अनुस्मारक की जांच करना चाहते हैं, तो आपको यूटीसी समय के अनुसार अब भेजने के लिए अनुस्मारक के लिए डेटाबेस में देखना होगा; अनिवार्य रूप से सभी अनुस्मारक प्राप्त करें जिनके पास टाइम स्टैंप है जो DateTime.Now.ToUniversalTime() से पहले है।

कुछ कार्यान्वयन बारीकियों के साथ अद्यतन: आप TimeZoneInfo.GetSystemTimeZones() विधि से समय क्षेत्रों की एक सूची प्राप्त कर सकते हैं; आप उपयोगकर्ता के लिए समय क्षेत्र की एक सूची दिखाने के लिए उन का उपयोग कर सकते हैं। मूल रूप से

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("<the time zone id>"); 
// May 7, 08:04:00 
DateTime userDateTime = new DateTime(2009, 5, 7, 8, 4, 0); 
DateTime utcDateTime = userDateTime.Subtract(tzi.BaseUtcOffset); 
+0

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

+0

यूटीसी में स्टोर करने के बजाय, मैंने जो सोचा था: मेरे पास मेरे reminder_schedule तालिका में तीन कॉलम होंगे जो "Original_DateTime", "UTC_DateTime" और "IST_DateTime" होंगे। अब Original_DateTime दिनांक का समय जो भी उपयोगकर्ता सेट करेगा, उस सटीक तारीख को संग्रहीत करेगा। यूटीसी_DateTime उपयोगकर्ताओं के समय क्षेत्र के आधार पर यूटीसी डेटटाइम स्टोर करेगा। और अंतिम "IST_DateTime" UTC_DateTime को भारतीय टाइमज़ोन में परिवर्तित करके भारतीय टाइमज़ोन के अनुसार डेटाटाइम स्टोर करेगा। फिर आखिर में मैं अपने अनुस्मारक को इन्डियन टमेज़ोन को प्रोसेसिंग प्रक्रिया भेजकर चलाऊंगा और इसलिए सभी अनुस्मारक सटीक समय पर भेजे जाएंगे। – Prashant

+0

मुझे यकीन नहीं है कि मैंने जो विचार ऊपर दिया है वह सही है लेकिन ये मेरा विचार है, कृपया मुझे बताएं कि मुझे आगे कैसे आगे बढ़ना चाहिए ?? – Prashant

0

, तुम सब करने की जरूरत है: यदि आपके द्वारा चयनित समय क्षेत्र से Id संपत्ति की दुकान, आप एक TimeZoneInfo वर्ग उदाहरण से किसी दिए गए स्थानीय तिथि/समय मान के लिए बना सकते हैं और गणना UTC समय स्थानीय समय पर ऑफ़सेट (घंटे + मिनट) जोड़ता है जिसे उपयोगकर्ता ने दर्ज किया है। ऑफ़सेट में जोड़ना मूल रूप से आपको यूटीसी (मूल रूप से जीएमटी) टाइमज़ोन में डेटटाइम देता है।

यूटीसी को अपने सभी समय मानकीकृत करना आमतौर पर आसान होता है, ताकि आपके एप्लिकेशन तर्क को ऑफ़सेट से निपटने की आवश्यकता न हो। आप दिनांक समय के बजाय DateTimeOffset संरचना का उपयोग को देखने के लिए अगर आप ढांचे 2.0 या बाद पर हैं चाहते हो सकता है http://msdn.microsoft.com/en-us/library/bb546099.aspx

2

:

यह पृष्ठ कुछ अच्छे उदाहरण हैं।

डेटटाइम ऑफसेट यूटीसी समय के सापेक्ष समय में एक बिंदु का प्रतिनिधित्व करता है, इसलिए इस मामले में काम करना आसान होना चाहिए।

18

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

समस्या यह है कि: आपके कोड-बैक को पता है कि क्लाइंट ब्राउज़र का समय क्षेत्र क्या है? मान लें कि उपयोगकर्ता कुछ दिनांक/समय मान (जैसे कि 12/30/2009 14:30) फ़ॉर्म में प्रवेश करता है और इसे सर्वर पर सबमिट करता है। यह मानते हुए कि उपयोगकर्ता ने स्थानीय समय सबमिट किया है, सर्वर कैसे जानता है कि इस मान को यूटीसी में कैसे परिवर्तित किया जाए?

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

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

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

using My.Utilities.Web; 
... 

// Derive the form class from BaseForm instead of Page. 
public class WebForm1: BaseForm 
{ 
... 
private void Page_Load(object sender, System.EventArgs e) 
{ 
    // If we only want to load the page to generate the time 
    // zone offset cookie, we do not need to do anything else. 
    if (InitializeLocalTime()) 
    return; 

    // Assume that txtStartDate is a TextBox control. 
    if (!IsPostback) 
    { 
    // To display a date-time value, convert it from GMT (UTC) 
    // to local time. 
    DateTime startDate = GetStartDateFromDB(...); 
    txtStartDate.Text = FormatLocalDate(startDate); 
    ... 
    } 
    else 
    { 
    // To save a date-time value, convert it from local 
    // time to GMT (UTC). 
    DateTime tempDate = DateTime.Parse(txtStartDate.Text); 
    DateTime startDate = ConvertLocalTimeToUtc(tempDate); 
    SaveStartDateInDB(startDate, ...); 
    ... 
    } 
} 
... 
} 

आप अधिक विशिष्ट जानकारी की जरूरत है, बाहर की जाँच It’s About Time: Localizing Time in ASP.NET Applications लेख (खेद है, लेकिन मैं प्रकाशक की साइट पर लेख के लिए एक सीधा लिंक नहीं है, एएसपी के बाद से .NETPRO केवल सशुल्क ग्राहकों तक पहुंच प्रतिबंधित करता है; हालांकि, पीडीएफ प्रतियों के लिंक हैं)। काश मैं लेख से नमूना पोस्ट कर सकता हूं, लेकिन मैं कॉपीराइट का उल्लंघन नहीं करना चाहता; हालांकि, यहां एक project to build a helper library है जिसमें सभी आवश्यक कार्यक्षमता और दस्तावेज़ीकरण (केवल उन चीज़ों को अनदेखा करें जिनकी आपको आवश्यकता नहीं है)।

अद्यतन: आलेख को नए प्रकाशक here द्वारा नमूना प्रोजेक्ट के साथ ऑनलाइन पोस्ट किया गया है।

+0

मैं इस बयान से असहमत हूं कि आपके ऐप को उपयोगकर्ता के टाइमज़ोन को स्वचालित रूप से निर्धारित करना चाहिए। उपयोगकर्ता अपने ऑपरेटिंग सिस्टम में इच्छित समय-समय/दिनांक/समय निर्धारित कर सकते हैं और अपने व्यावसायिक नियमों को बाईपास कर सकते हैं। उपयोगकर्ता इनपुट पर भरोसा न करें। – BrunoSalvino

+4

मैं आपके बिंदु ब्रूनो को नहीं समझता। सबसे पहले, समय क्षेत्र से जुड़े कोई व्यवसाय नियम नहीं हैं। यह उपयोगिता का मुद्दा है। हम जीएमटी का इस्तेमाल कर सकते थे, लेकिन यह उपयोगकर्ताओं के लिए सुविधाजनक नहीं है, इसलिए हम स्थानीय समय का उपयोग करते हैं। यदि उपयोगकर्ता सिस्टम घड़ी (या जो भी तरीका वे समय क्षेत्र निर्दिष्ट करने के लिए उपयोग करते हैं) को बदलता है, तो कौन परवाह करता है? मुझे यहां कोई समस्या नहीं दिख रही है। मैं आपके पहले कथन से दूसरे कथन में एक संक्रमण का भी पालन नहीं कर रहा हूं। क्या आपको "स्वचालित" भाग पसंद नहीं है, या आप स्थानीय समय का उपयोग करने के विचार को पसंद नहीं करते हैं (यदि यह स्वचालित रूप से नहीं किया जाता है, तो उपयोगकर्ता इसे किसी भी तरह से बदलने में सक्षम होना चाहिए, सही)? –

+0

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

3

अब तक के सभी उत्तरों के साथ समस्या यह है कि वे यह नहीं मानते कि प्रशांत क्या हासिल करने की कोशिश कर रहा है। यदि डेलाइट बचत परिवर्तन से पहले दिन में उसकी प्रणाली के उपयोगकर्ता के पास +12 का ऑफसेट होता है और अगले दिन के लिए एक अनुस्मारक सेट करता है, तो उसके ऑफसेट को जब रिमाइंडर ट्रिगर किया जाता है तो इसके बजाय +13 होगा।

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

0

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

ऐसा लगता है कि निर्मित यहां समर्थन है: http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttime.aspx

इसे अपने आप को आज़माया नहीं लेकिन यह लेखांकन, सही रूपांतरण वादा करने लगता है डेलाइट बचत के लिए।http://www.worldtimeserver.com/time_zone_guide/

1

2 चरण हैं::

  • का उपयोग कर ग्राहक के पक्ष में अलग अलग समय क्षेत्र का पता लगाने जावास्क्रिप्ट:

    यदि नहीं, तो यहाँ एक (pricey) वाणिज्यिक उपकरण मैं का इस्तेमाल किया है है

    var dt = new Date(); 
    var diffInMinutes = -dt.getTimezoneOffset(); 
    
  • फिर सर्वर की तरफ, सी # कोड सर्वर समय को ग्राहक समय में क्लाइंट टाइम में कनवर्ट करने के लिए ऊपर दिए गए टाइमज़ोन ऑफ़सेट पर आधारित:

------------------------;

string queryStr = Request.QueryString["diffInMinutes"]; 
int diffInMinutes = 0; 
if (Int32.TryParse(queryStr, out diffInMinutes)) 
{ 
    clientTime = serverTime.ToUniversalTime().AddMinutes(diffInMinutes); 
} 
+0

मेरे लिए काम करता है। अच्छा उदाहरण। समस्या यूटीसी के रूप में तारीख को संग्रहीत नहीं कर रही है क्योंकि आपने दिखाया है कि यदि आवश्यक हो तो यूटीसी में कनवर्ट करने के लिए पहले से ही "ToUniveralTime()" विधि है। वास्तविक समस्या स्थानीय टाइमज़ोन ऑफसेट प्राप्त कर रही है जहां ग्राहक स्थित है। यह उदाहरण एमवीसी के लिए भी बहुत अच्छा काम करता है जहां जेसन ऑब्जेक्ट्स नियंत्रक को पास हो जाता है। –

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