2008-12-01 9 views
8

के लिए डेटटाइम सीरियलाइजेशन ओवरराइड करें मैं एक बड़े कोड बेस में एक बग की सफाई करने पर काम कर रहा हूं जहां कोई स्थानीय समय बनाम यूटीसी समय पर ध्यान नहीं दे रहा था।एएसपी.नेट वेबमाइड पैरामीटर

हम जो चाहते हैं वह वैश्विक स्तर पर हमारी एएसपी.नेट वेब सेवाओं से भेजे गए डेटटाइम ऑब्जेक्ट्स पर समय क्षेत्र की जानकारी को अनदेखा करने का एक तरीका है। मुझे ऑपरेशन पुनर्प्राप्त करने का समाधान मिला है। डेटा केवल डेटासेट में लौटाया जाता है, और मैं डेटटाइम कॉलम देख सकता हूं और डेटटाइमोड को निर्दिष्ट नहीं कर सकता। यह डेटा सेट के अंदर और आगे के सभी डेटा के लिए मेरी समस्या हल करता है।

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

ऐसी चीज संभव है? या क्या मैं ऐसा करना चाहता हूं जो मैं करना चाहता हूं?

बस दोहराने के लिए - मुझे समय क्षेत्र की परवाह नहीं है, हर कोई एक ही समय क्षेत्र में है। लेकिन कुछ उपयोगकर्ताओं के पास मशीनों को बुरी तरह कॉन्फ़िगर किया गया है, गलत समय क्षेत्र, इत्यादि। इसलिए जब वे 1 जुलाई, 2008 को भेजते हैं, तो मुझे 30 जून, 2008 22:00:00 सर्वर की तरफ मिल रहा है, जहां यह स्वचालित रूप से इसे अपने से परिवर्तित कर रहा है स्थानीय समय सर्वर के स्थानीय समय के लिए।

अद्यतन: एक और संभावना यह होगी कि क्लाइंट पक्ष में बदलाव करना संभव हो। .NET कोड जिस तरह से दिनांक 'अपरिभाषित' के साथ डेटटाइम ऑब्जेक्ट्स को क्रमबद्ध करने के लिए परिवर्तित किया जाता है।

उत्तर

4

मैंने अक्सर कई अनुप्रयोगों, सेवाओं और विभिन्न प्लेटफार्मों (.NET, Java, आदि) में इसका सामना किया है। कृपया मुझे विश्वास करें कि आप लंबे समय तक नतीजे नहीं चाहते हैं कि आपको समय क्षेत्र की परवाह नहीं है। बहुत सारी त्रुटियों का पीछा करने के बाद जो बेहद मुश्किल और महंगे हैं, आप चाहेंगे कि आप परवाह है।

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

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

यदि आप इसे सही तरीके से ठीक करते हैं, तो यह आसान और सस्ता हो सकता है। यदि आप जानबूझकर इसे और तोड़ते हैं क्योंकि आपको लगता है कि यह सस्ता होगा, तो आपको भयानक गड़बड़ी को उलझाने के बाद बाद में कोई बहाना नहीं होगा।

ध्यान दें कि यह स्ट्रिंग्स के साथ सामान्य समस्या के समान है: सादा पाठ (एक वर्ण एन्कोडिंग से रहित एक स्ट्रिंग) जैसी कोई चीज़ नहीं है और सादा (कोई समय क्षेत्र) समय/तिथि जैसी कोई चीज़ नहीं है । अन्यथा नाटक करना बहुत दर्द और दिल का दर्द, और शर्मनाक त्रुटियों का स्रोत है।

+0

नहीं, हम समय क्षेत्र की जानकारी को पट्टी करना चाहते हैं। हमारे पास क्लाइंट इंस्टॉलेशन तक पहुंच नहीं है, हम डेटा तक पहुंचने वाले कई अलग-अलग ऐप्स के कारण पूर्ववर्ती डेटाबेस डेटा को यूटीसी समय में नहीं बदल सकते हैं। अगर कोई दिनांक चुनिंदा आइटम से 1 जुलाई का चयन करता है, तो हम 30 जून के रूप में सर्वर पर नहीं आ सकते हैं। – Clyde

+0

फिर भी इसे डाउन-वोट की आवश्यकता नहीं है। उत्तर प्रश्न के दायरे में वैध है (प्रश्न ने प्रतिबंध निर्दिष्ट नहीं किए हैं)। –

+1

-1 यह उनके प्रश्न का उत्तर नहीं था, आप अपनी परियोजना के ब्योरे के बारे में धारणाएं कर रहे हैं। – Element

1

ठीक है, मेरे पास इसके लिए एक कामकाज है, जो इस तथ्य पर निर्भर करता है कि मुझे केवल दिनांक समय के दिनांक भाग की आवश्यकता है। रों के बजाय की तारीख:: मैं प्रणाली

<XmlElement(DataType:="date")> 

यह उत्पन्न wsdl में परिवर्तन प्रकार रों के लिए में हर तिथि या datetime से मैप पैरामीटर के लिए इस संपत्ति देते dateTime। (ध्यान दें कि बस का प्रकार है।नेट विधि पैरामीटर डेटटाइम के बजाए एक तिथि होनी चाहिए, इसे पूरा नहीं किया)। तो ग्राहक अब डेटटाइम के दिनांक हिस्से को भेजता है, कोई समय की जानकारी नहीं, समय क्षेत्र जानकारी नहीं देता है।

यदि मुझे कभी भी सर्वर पर दिनांक और समय मान भेजने की आवश्यकता है, तो मुझे इसे एक स्ट्रिंग पैरामीटर बनाने की तरह कुछ अन्य कामकाज का उपयोग करना होगा।

+1

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

1

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

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