डेलाइट सेविंग टाइम के दौरान स्थानीय समय प्राप्त करने के लिए TimeZoneInfo का उपयोग कैसे करें?


84

मैं DateTimeOffsetकिसी भी समय क्षेत्र में समय में एक विशिष्ट क्षण को व्यक्त करने के लिए उपयोग करने की कोशिश कर रहा हूं। मैं यह नहीं जान सकता कि 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 अपराह्न
6/2/2010 3:37:19 PM -06: 00

मैं केंद्रीय समय क्षेत्र में हूं, और हम वर्तमान में दिन के समय की बचत में हैं। मैं दूसरी पंक्ति पढ़ने की कोशिश कर रहा हूं:

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

BaseUtcOffset जाहिरा तौर पर डीएसटी के आधार पर परिवर्तन नहीं होता है।

मैं उचित ऑफसेट मूल्य के साथ सही समय कैसे प्राप्त कर सकता हूं?


13
+1 - यह मुझे पागल कर देता है कि TimeZoneInfo.ConvertTimeBySystemTimeZoneId इस के लिए काम नहीं करता है :)
जेम्स मैनिंग

@JamesManning - ऐसा लगता है, dt.Kindसही ढंग से सेट किया गया है।
मैट जॉनसन-पिंट

जवाबों:


61

आपको 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)));

मैं देख रहा हूँ ... आपको उस विशिष्ट तिथि के लिए UTC की समय-सीमा में छूट मिल गई है। धन्यवाद।
जैमिंटो

5
कार्ल ग्जर्त्सेन के उत्तर की तुलना में यह सबसे अच्छा तरीका नहीं है जो एक नया, थ्रो-दूर बनाने के माध्यम से ऑफसेट निकालने के बजाय एकल .Net फ़ंक्शन का उपयोग करता है DateTimeOffset
एरिक

59

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

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

क्या होगा यदि मेरे देश का समय क्षेत्र गर्मियों में ईईएसटी और सर्दियों में ईईटी है? डेलाइट सेविंग के साथ वह कैसे काम करेगा?
रामी ज़ेबियन

1
विंडोज़ समय-काल की जानकारी के साथ-साथ दिन की बचत के समय की तारीखों को भी जानता है। यदि आप पूर्व-निर्धारित समय-क्षेत्रों में से किसी एक को चुनते हैं, तो इसे पूरा करना चाहिए।
कार्ल जार्जेटन

11

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

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

2
क्या आप TimeZoneInfo.Localसीधे इस्तेमाल नहीं कर सकते ? आपको कॉल की आवश्यकता क्यों है FindSystemTimeZoneById?
कोडरडेन

4
आप सही हैं, हमें इसकी आवश्यकता नहीं है। हम इसे बस इस तरह से कर सकते हैंDateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(networkDateTime, TimeZoneInfo.Local);
प्रबेंटर

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

9
यह बहुत सुरक्षित नहीं है। यदि आप अपने अनुप्रयोग को क्लाउड वातावरण में आउटसोर्स कर रहे हैं, तो आपको नहीं पता कि प्रति समय कौन सा समय स्थानीय है।
टॉम

5

मैं .NET और स्टैकओवरफ़्लो दोनों में शुरुआती हूं, इसलिए मैं गलत हो सकता हूं, लेकिन यहां जाता है:

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

यदि आप इसके बजाय किसी विशिष्ट समय के लिए ऑफ़सेट प्राप्त करने के लिए GetUtcOffset का उपयोग करते हैं, और फिर DateTimeOffset ऑब्जेक्ट पर एक ToOffset करते हैं, तो घंटे / मिनट और ऑफ़सेट दोनों ही सही रूप से परिवर्तित हो जाएंगे, और आप सुरक्षित रूप से 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" वापस आ जाएगी।


ओपी के अनुसार यह सही उत्तर है। समझने की मुख्य बात यह है कि एक टाइमज़ोन के लिए UtcOffset स्थिर नहीं है, इसके बजाय यह उस तारीख पर निर्भर करता है जो हम दिन के समय की बचत के नियमों के बारे में बात कर रहे हैं । तो केवल गलती यह है कि ओपी ने जो किया है, वह GetUtcOffset (myDate) के बजाय लगातार बेस यूटीसीऑफसेट का उपयोग करता है
g.pickardou
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.