2010-06-02 15 views
57

मैं किसी भी समय क्षेत्र में समय में एक विशिष्ट पल व्यक्त करने के लिए डेटटाइम ऑफसेट का उपयोग करने की कोशिश कर रहा हूं। मैं डेलाइट बचत समय से निपटने के लिए TimeZoneInfo का उपयोग करने का तरीका नहीं समझ सकता।डेलाइट सेविंग्स टाइम के दौरान स्थानीय समय प्राप्त करने के लिए TimeZoneInfo का उपयोग कैसे करें?

var dt = DateTime.UtcNow; 
Console.WriteLine(dt.ToLocalTime()); 

var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero); 
Console.WriteLine(utcOffset.ToOffset(tz.BaseUtcOffset)); 

यह बाहर प्रिंट:

6/2/2010 4:37:19 PM 
6/2/2010 3:37:19 PM -06:00 

मैं केंद्रीय समय क्षेत्र में हूँ, और और हम डेलाइट सेविंग टाइम में हैं। मैं पढ़ने के लिए दूसरी पंक्ति पाने के लिए कोशिश कर रहा हूँ:

6/2/2010 4:37:19 PM -05:00 

BaseUtcOffset जाहिरा तौर पर डीएसटी के आधार पर बदल नहीं करता है।

मुझे उचित ऑफ़सेट मूल्य के साथ सही समय कैसे मिल सकता है?

+9

+1 - यह मुझे पागल है कि TimeZoneInfo.ConvertTimeBySystemTimeZoneId बस इस :) –

उत्तर

47

आप TimeZoneInfo से UTCOFFSET प्राप्त करने की आवश्यकता है, तो ToOffset है कि पारित() विधि:

var dt = DateTime.UtcNow; 
Console.WriteLine(dt.ToLocalTime()); 

var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero); 
Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset))); 
+0

मैं देख लिए काम नहीं करता ड्राइव ... तुम मिल गया है यूटीसी में है कि विशिष्ट तिथि के लिए ऑफसेट पाने के लिए टाइमज़ोन धन्यवाद। – jaminto

+3

[कार्ल गजर्टसन के उत्तर] (http://stackoverflow.com/a/16789973/57611) की तुलना में यह सबसे अच्छा तरीका नहीं है जो एक नया बनाने के माध्यम से ऑफ़सेट निकालने के बजाय नौकरी करने के लिए एकल .Net फ़ंक्शन का उपयोग करता है, 'डेटटाइम ऑफसेट' फेंक दें। – ErikE

35

तुम भी TimeZoneInfo.ConvertTimeFromUtc, जो डेलाइट बचत समय के लिए अनुमति देगा का उपयोग कर सकते हैं:

DateTime utc = DateTime.UtcNow; 
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone); 
5

या बेहतर, आप समय क्षेत्र पहचानकर्ता मुश्किल कोड नहीं करना चाहते हैं:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id); 
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi); 
+0

क्या आप अभी 'TimeZoneInfo.Local' का उपयोग नहीं कर सके? आपको 'FindSystemTimeZoneById'' पर कॉल की आवश्यकता क्यों है? – CoderDennis

+1

आप सही हैं, हमें इसकी आवश्यकता नहीं है। हम इसे इस तरह की 'डेटटाइम स्थानीयडेट टाइम = टाइमज़ोनइन्फो। कन्वर्टटाइमफ्रॉमयूटीसी (नेटवर्कडेट टाइम, टाइमज़ोनइन्फो) की तरह कर सकते हैं।स्थानीय); ' – Pabinator

+0

लेकिन फिर आप एक ही समय क्षेत्र में तय कर रहे हैं। इस बात पर निर्भर करता है कि आप मुझे लगता है कि कोड का उपयोग कैसे करना चाहते हैं। :-) –

1

मैं दोनों नेट और stackoverflow पर अभी शुरुआत कर रहा हूँ, तो मैं गलत हो सकता है, लेकिन यहाँ जाता है:

का उपयोग TimeZoneInfo.ConvertTimeFromUtc डेलाइट बचत समय के लिए अनुमति देगा, और समय के अनुसार सही समय में कनवर्ट करें जोन + एक संभावित डीएसटी ऑफ़सेट। हालांकि - परिणामस्वरूप ऑब्जेक्ट में ऑफसेट स्वयं मानक समय के लिए ऑफ़सेट दिखाएगा, और डेलाइट सेविंग टाइम को ध्यान में नहीं लेगा। तो यदि आप ऑब्जेक्ट पर ToString करना चाहते हैं, तो आप सही समय (घंटों और मिनटों में) के साथ समाप्त हो जाएंगे, लेकिन डेलाइट सेविंग टाइम के दौरान गलत ऑफ़सेट होगा, जो बाद में कोड में गलत पल का कारण बन सकता है।

आप के बजाय एक विशिष्ट समय के लिए ऑफसेट पाने के लिए, और फिर DateTimeOffset वस्तु पर एक ToOffset करते हैं, दोनों घंटे/मिनट और GetUtcOffset का उपयोग करते हैं ऑफसेट ही सही ढंग से परिवर्तित हो जाएगा, और आप सुरक्षित रूप से एक ToString कर सकते हैं ।

string ExpectedDateTimePattern = "yyyy'-'MM'-'dd'T'HH':'mm':'ss''zzz"; 
string timeZoneId = "FLE Standard Time"; 
string dateTimestr = "2017-10-09T09:00:00+02:00"; 

DateTimeOffset dto = DateTimeOffset.Parse(dateTimeStr); 
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); 
TimeSpan offset = zone.GetUtcOffset(dto); 
dto = dto.ToOffset(offset); 
string localTime = dto.ToString(ExpectedDateTimePattern); 

स्थानीय समय "2017-10-09T10: 00: 00 + 03: 00" वापस आ जाएगा।

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