2013-05-20 7 views
5

मैं एक मुद्दा यूटीसी के रूप में datetimes भंडारण के खिलाफ कर रहा हूँ करने के लिए स्थानीय समय और उलझन में जब समय क्षेत्र बदलने के कारण है कि इस समान ही परिणाम नहीं करता है:परिवर्तित यूटीसी

var dt = DateTime.Parse("1/1/2013"); 
MessageBox.Show(TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local).ToString()); 

मैं मैन्युअल पर अपने स्थानीय समय क्षेत्र स्विचन हूँ पूर्वी और केंद्रीय के बीच मशीन।

केंद्रीय उपज 1/1/2013 6:00:00 AM, और पूर्वी उपज 1/1/2013 5:00:00 AM। मुझे यहां क्या समझ नहीं आ रहा है? वे समय क्षेत्र के बावजूद समान होना चाहिए, सही?

अग्रिम धन्यवाद!

+4

तो आप एक ही प्रारंभिक समय यह यूटीसी में परिवर्तित करने, और हो रही विभिन्न यूटीसी बार ले जा रहे हैं, एक समय क्षेत्र में संबद्ध,? लगता है जैसे यह काम कर रहा है। – cadrell0

+0

मुझे लगता है कि यूटीसी/स्थानीय डेटाटाइम्स के साथ मुद्दों को पूरी तरह से समझने के लिए आपको जॉन स्कीट द्वारा इस ब्लॉग पोस्ट को पढ़ने की आवश्यकता है: http://noda-time.blogspot.co.uk/2011/08/what-wrong-with-datetime-anyway .html –

+0

मुझे नहीं पता कि आप यूटीसी में क्यों परिवर्तित करना चाहते हैं। यूटीसी में बस शुरू करने के बारे में कैसे? 'DateTime.Parse' का अधिभार है जो आपको 'Kind' निर्दिष्ट करने की अनुमति देता है। – CodesInChaos

उत्तर

8

के लिए एक .ToUtc() विधि नहीं है। यह सिर्फ एक तिथि और समय है जो किसी भी समय क्षेत्र में हो सकता है। जब आप TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local) पर कॉल करते हैं, तो आप इसे बता रहे हैं कि यह किस समय क्षेत्र में शुरू होता है। इसलिए यदि आप मध्य में शुरू करते हैं, तो आपको एक जवाब मिलेगा, जबकि यदि आप पूर्वी में शुरू करते हैं, तो आपको एक जवाब मिलेगा जो एक घंटे पहले यूटीसी है। दरअसल, यह आपका कोड दिखाता है।

+0

में एक घंटे से अलग होगा, इसलिए यदि मैं सेंट्रल पर डेटटाइम.Now.ToUniversalTime() चलाता हूं तो यह वही है जैसा कि मैं पूर्वी पर चलता हूं। मैं डेटाटाइम ऑब्जेक्ट कैसे बना सकता हूं कि जब मैं सार्वभौमिक रूपांतरित हो जाता हूं, तो यह समय क्षेत्र के समान ही है ??? –

+0

@ user1174729 - जब आप कहते हैं "अब" आप समय पर तत्काल बात कर रहे हैं। यदि आपने अपने समय क्षेत्र में आधी रात को "अब" कहा था, तो यह मध्यरात्रि नहीं होगा। यदि आप टाइमटाइम पर ध्यान दिए बिना एक डेटाटाइम बनाना चाहते हैं, तो आपको इसे यूटीसी में बनाना होगा। एक कन्स्ट्रक्टर है जिसे आप 'डेटटाइमकिंड.यूटीसी' पास कर सकते हैं। –

+0

हां, मैट ने क्या कहा। यह चाल हमेशा यूटीसी में डेटटाइम्स के साथ काम करना है, और फिर उन्हें प्रदर्शित करते समय उन्हें उपयोगकर्ता के समय क्षेत्र में परिवर्तित करना है। –

3

मुझे लगता है कि आप याद कर रहे हैं कि DateTime अपने DateTime.Parse() बयान से लौटे एक समय क्षेत्र के साथ नहीं आता है DateTime वर्ग

+0

के लिए इसी परिणाम: MessageBox.Show (dt.ToUniversalTime()। ToString()); –

+0

यह सही है। बीटीडब्ल्यू, सीएसटी और ईएसटी के लिए एक ही समय वास्तव में यूटीसी –

1

यह आधी रात

var dt = DateTime.Parse("1/1/2013"); 

पूर्वी में आधी रात है और केंद्रीय ही निरपेक्ष समय नहीं है।
यह समय क्षेत्र का पूरा उद्देश्य है।

+0

हाँ, यह सही जवाब है। एक टाइमज़ोन में आधी रात 5UTC है और दूसरी टाइमज़ोन में आधी रात 6UTC है। –

0

आप NodaTime उपयोग कर सकते हैं:

static string LocalTimeToUTC(string timeZone, string localDateTime) 
{ 
    var pattern = LocalDateTimePattern.CreateWithInvariantCulture("dd/MM/yyyy HH:mm:ss"); 
    LocalDateTime ldt = pattern.Parse(localDateTime).Value; 
    ZonedDateTime zdt = ldt.InZoneLeniently(DateTimeZoneProviders.Tzdb[timeZone]); 
    Instant instant = zdt.ToInstant(); 
    ZonedDateTime utc = instant.InUtc(); 
    string output = utc.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture); 

    return output; 
} 
संबंधित मुद्दे