2011-05-27 15 views
10

मैं DateTimeWithZone struct कि जॉन स्कीट Creating a DateTime in a specific Time Zone in c# fx 3.5Convert दिनांक समय पहले से ही केवल नहीं तो यूटीसी

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

मेरे मामले में हम ज्यादातर यूटीसी में पहले से ही डेटटाइम ऑब्जेक्ट्स में गुज़रेंगे (क्योंकि यह वही है जो हम भंडारित कर रहे हैं) इसलिए हमें केवल स्रोत प्रदर्शन करने की आवश्यकता है यदि स्रोत डेटटाइम है। किंड यूटीसी नहीं है।

इसलिए मैं करने के लिए निर्माता बदल दिया है:

public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone, DateTimeKind kind = DateTimeKind.Utc) { 
     dateTime = DateTime.SpecifyKind(dateTime, kind); 
     utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, timeZone); 
     this.timeZone = timeZone; 
    } 

यहाँ हम एक वैकल्पिक प्रकार पैरामीटर कि UTC से चूक की है। क्योंकि आपूर्ति की दिनांक समय प्रकार संपत्ति को ठीक से सेट नहीं था

रूपांतरण पूरा नहीं किया जा सका:

हालांकि, इस कोड चल रहा है और एक यूटीसी दिनांक समय गुजर निम्नलिखित अपवाद उत्पन्न करता है। उदाहरण के लिए, जब दयालु संपत्ति DateTimeKind.Local है, स्रोत समय क्षेत्र TimeZoneInfo.Local होना चाहिए।

डॉक्स (http://msdn.microsoft.com/en-us/library/bb495915.aspx) के अनुसार:

dateTime पैरामीटर के प्रकार संपत्ति DateTimeKind.Utc के बराबर होती है और sourceTimeZone पैरामीटर TimeZoneInfo.Utc के बराबर होती है, तो इस विधि किसी भी रूपांतरण के बिना प्रदर्शन dateTime देता है।

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

क्या मुझे गलत समझा गया है?

+0

क्या आपका ओएस एक्सपी है? – V4Vendetta

+0

नहीं, यह उपर्युक्त उदाहरण में विंडोज 7 –

उत्तर

12

MSDN डॉक्स की तरह कहते हैं कि अगर आप तरह DateTimeKind.Utc के अलावा कुछ भी करने के लिए सेट के साथ एक DateTime में गुजरती हैं और एक अपवाद फेंक होगा रूपांतरण समारोह यूटीसी की तुलना में एक TimeZone अन्य निर्दिष्ट करें। यह होना चाहिए कि यहां क्या हो रहा है। आपके कोड में आपको यह जांचना चाहिए कि डेटटाइम पहले से ही यूटीसी में है या नहीं, तो रूपांतरण को छोड़ दें।

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

docs

से

समन्वित सार्वभौमिक समय (UTC) करने के लिए एक निर्दिष्ट समय क्षेत्र में समय बदलता है।

जिसका अर्थ है कि यह समय UTC

समारोह को आपूर्ति क्षेत्र से धर्मान्तरित एक तर्क अपवाद फेंकता है तो:

dateTime .Kind DateTimeKind.Utc है और sourceTimeZone बराबर नहीं है TimeZoneInfo.Utc।

-या-

dateTime .Kind DateTimeKind.Local है और sourceTimeZone बराबर TimeZoneInfo.Local नहीं करता है।

-या-

sourceTimeZone .IsInvalidDateTime ( DATETIME) सच देता है।

+0

है, इनपुट तिथि, लक्ष्य समय क्षेत्र और स्थानीय टाइमज़ोन ('टाइमज़ोनइन्फो.लोकल') दोनों की तरह डेटटाइमकिंड.यूटीसी है, इसलिए इसे अपवाद नहीं देना चाहिए। –

+0

@ बेन हां इसे चाहिए। 'ConvertTimeToUtc' ** ** से utz को निर्दिष्ट टाइमज़ोन से कनवर्ट करता है। यदि टाइमज़ोन स्थानीय टाइमज़ोन है तो डेटटाइम आप पास कर रहे हैं 'डेटटाइमकिंड.लोकल' – Yaur

+0

का होना चाहिए क्या आप मुझे दस्तावेज़ों में इस पर इंगित कर सकते हैं? –

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