2015-04-17 3 views
5

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

मुद्दा यह है कि साइट एक (इंटर) राष्ट्रीय एप्लिकेशन है और मैं ग्राहकों को अमेरिका या कनाडा के भीतर कहीं भी रख सकता हूं। साइट्स में से एक चीज नियुक्तियों को शेड्यूल करने के लिए एक प्रकार का "शेड्यूलर" है। हमने यूटीसी प्रारूप में डेटाबेस पर सभी डेटटाइम मानों को स्टोर करने के लिए विकास की आसानी का निर्णय लिया और एपीआई के अंदर और बाहर सभी ट्रैफिक यूटीसी में भी हैं। समस्या यह है कि जब मैं सर्वर पक्ष पर दिनांक/समय मान बना रहा हूं तो मैं अक्सर समस्याओं में भाग ले रहा हूं।

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

var appointment = new new DateTime(2015, 04, 17, 08, 00, 00, DateTimeKind.Unspecified) 
var utcAppointment = TimeZoneInfo.ConvertTimeToUtc(appointment, 
         TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")) 

मैं अन्य दिनांक/समय जोड़तोड़ के बहुत सारे के साथ-साथ भीतर मेरा कार्यक्रम करते हैं और बस के बजाय Nodatime के लिए जा रहा की सोच रहा हूँ। मुझे पता है कि मैं यूटीसी डेटटाइम को आसानी से एक नोडटाइम चर से बाहर प्राप्त कर सकता हूं। मैं इस बारे में उलझन में हूं कि विशिष्ट समय क्षेत्र के लिए किसी विशिष्ट समय क्षेत्र के लिए नोडटाइम चर कैसे बनाना है? मेरे द्वारा देखे जाने वाले सभी उदाहरणों को पैटर्न के साथ करना और तारों को पढ़ना या एक त्वरित बनाना है जो अनिवार्य रूप से "अब" है। मैं "बीईएल" की परवाह किए बिना मौजूदा बीसीएल डेटटाइम ऑब्जेक्ट लेने की तरह कुछ करना चाहता हूं, और इसे सेट किए गए विशिष्ट समय क्षेत्र के साथ इसे एक नोडटाइम ऑब्जेक्ट में परिवर्तित करना चाहता हूं।

मुझे लगता है कि नोडाटाइम एक महान पुस्तकालय है, लेकिन यूजरगाइड पढ़ने से मुझे बीसीएल में और बाहर परिवर्तित करने के बारे में अपने सिर को खरोंच कर दिया गया।

+0

मैंने कुछ इसी तरह से पूछा [यहां] (http://stackoverflow.com/q/7553997/397817) लेकिन यह मूल रूप से नोडाटाइम प्रश्न नहीं था। इस प्रश्न के भावी पाठकों के लिए चर्चा उपयोगी हो सकती है। इसके अलावा मैं वेब एपीआई में नोडाटाइम प्रकारों का उपयोग करने के दूसरे जॉन स्कीट के सुझाव को भी उपयुक्त कर सकता हूं, जहां उपयुक्त हो, उदा। आपके शेड्यूल के समय के लिए एक स्थानीय समय - serialization, NodaTime.Serialization.JsonNet के लिए एक सहायक लाइब्रेरी भी है। –

उत्तर

9

मैं इस बारे में उलझन में हूं कि किसी विशिष्ट दिनांक क्षेत्र के लिए किसी विशिष्ट समय क्षेत्र के लिए नोडटाइम चर कैसे बनाना है?

कि अपेक्षाकृत आसान है:

LocalDateTime local = new LocalDateTime(2015, 4, 17, 8, 0, 0); 
DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/Los_Angeles"]; 
ZonedDateTime zonedTime = local.InZoneLeniently(zone); 

"leniently" भाग वास्तव में आप क्या होने अगर 08:00 पता चला है या छोड़ी जाने वाली अस्पष्ट चाहते पर निर्भर करता है -, कि इस मामले में नहीं होगा लेकिन यह ध्यान में रखना कुछ है। नोडा टाइम आपको विभिन्न तरीकों से इसका सामना करने देता है - user guide अधिक जानकारी में जाता है।

ध्यान दें कि यदि आप रूपांतरण करने वाले क्षेत्र के संदर्भ में सोचना पसंद करते हैं, तो आप इसके बजाय zone.AtLeniently(local) का उपयोग कर सकते हैं - वे बिल्कुल समकक्ष हैं।

+0

यदि मेरे पास मौजूदा बीसीएल डेटटाइम ऑब्जेक्ट होना था, तो मैं इसे लेता हूं, मैं स्थानीयडेटाइम का उपयोग कर सकता हूं। फ्रॉमडेट टाइम (ऑब्जेक्टनाम) भी? – SpaceCowboy74

+0

@ SpaceCowboy74: हाँ, हालांकि मैं जितना संभव हो सके नोडा टाइम प्रकारों का उपयोग करने की सलाह दूंगा। –

+0

समझा। समस्या यह है कि बाहरी ताकतों और वेबएपी स्वयं अवसर पर मुझे टाइमटाइम ऑब्जेक्ट्स में पास करते हैं। मुझे यूटीसी में बदलने के लिए उनको उपभोग करने की ज़रूरत है। मैंने कुछ को सैंडबॉक्स किया और ऊपर दिए गए कोड के साथ ऐसा करने में सक्षम था और फिर ZDTTime को EntityFramwork में ToDateTimeUtc कॉल के साथ पास कर रहा था। – SpaceCowboy74

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