2009-01-13 19 views
38

चाहे किसी भी समय क्षेत्र के लिए डेटटाइम प्राप्त करें सी # (.NET 2.0) का उपयोग करते हुए उपयोगकर्ता के स्थानीय समय क्षेत्र को सेट करने के बावजूद मुझे पूर्वी समय क्षेत्र में समय (दिनांक समय वस्तु) निर्धारित करने की आवश्यकता है।स्थानीय समय क्षेत्र

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

DateTime.Now 
DateTime.UtcNow 
TimeZone.CurrentTimeZone 
बेशक

, समाधान की जरूरत है डेलाइट बचत समय जागरूक होने के लिए।

+0

कृपया http://stackoverflow.com/questions/27415652/get-eastern-time-in-c-sharp-without-converting-local-time – Jay

उत्तर

8

जैसा कि सभी ने उल्लेख किया है, .NET 2 में कोई भी समय क्षेत्र जानकारी नहीं है। जानकारी, रजिस्ट्री में संग्रहीत किया जाता है, हालांकि, और इसकी काफी इसके चारों ओर एक आवरण वर्ग लिखने के लिए तुच्छ:

SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ समय क्षेत्र

सभी समय क्षेत्र के लिए उप कुंजियां मौजूद । TZI फ़ील्ड मान में समय क्षेत्र के लिए सभी संक्रमण और पूर्वाग्रह गुण होते हैं, लेकिन यह सब बाइनरी सरणी में भरा हुआ है।

int bias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 0); 
int daylightBias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 8); 

यह पृष्ठ एक उचित सारांश है: http://burks.brighton.ac.uk/burks/language/pascal/uddf/pages/registry.htm

+0

लिंक टूटा हुआ है ... –

+0

Archive.org लिंक: https://web.archive.org/web/20090807133141/http: //burks.brighton.ac.uk/burks/language/pascal/uddf/pages/registry.htm – orev

1

कैसे के बारे में

DateTime lclTime = DateTime.Now; 
DateTime ept = lclTime.ToUniversalTime().AddHours(
        IsEasternDaylightSavingTime(
         lclTime.ToUniversalTime())? -5: -4) 

या आप पहले से ही स्थानीय यूटीसी, वसंत-आगे के लिए कड़ी मेहनत कोडित मूल्यों का सिर्फ

DateTime lclUtc = DateTime.UtcNow; 
DateTime ept = lclUtc.AddHours(
        IsEasternDaylightSavingTime(lclUtc)? -5: -4) 

स्थिर शब्दकोश का प्रयोग किया है और अगले के लिए पूर्वी समय के लिए तारीखों वापस चले जाते हैं 50 साल .. यह केवल 300 बाइट्स है या तो ... और फिर यह निर्धारित करने के लिए सूचकांक कि यह पूर्वी तट पर डेलाइट बचत समय है ... जैसा कि बताया गया है, आप परवाह नहीं है कि यह स्थानीय क्षेत्र में डीएसटी है या नहीं ..

private static bool IsEasternDaylightSavingTime(DateTime utcDateTime) 
    { 
     // hard coded method to determine 
     // whether utc datetime is Eastern Standard time 
     // or Eastern Daylight Time 
    } 
+0

देखना क्या यदि आपका स्थान डीएसटी का उपयोग नहीं करता है? फिर IsDaylightSavingTime झूठी वापसी करेगा। –

+0

यूटीसी डीएसटी से प्रभावित नहीं होगा; निश्चित रूप से यह पूर्वी का डीएसटी है जिसे हमें स्थानीय लोगों के बारे में जानने की जरूरत है। –

+0

मुझे मिल गया ... मुझे नहीं पता कि क्या आप एक अलग टाइमज़ोन के लिए टाइमज़ोन ऑब्जेक्ट बना सकते हैं जिसे कंप्यूटर सेट किया गया है। और आप एक टाइमज़ोन ऑब्जेक्ट fpr पूर्वी समय निर्धारित करेंगे कि यह डीएसटी है या नहीं ... –

78

.NET 3.5 में, TimeZoneInfo है, जो इस क्षेत्र में बहुत सारी कार्यक्षमता प्रदान करता है; 2.0SP1 में DateTimeOffset है, लेकिन यह बहुत अधिक सीमित है।

UtcNow प्राप्त करना और एक निश्चित ऑफ़सेट जोड़ना नौकरी का हिस्सा है, लेकिन डीएसटी-जागरूक नहीं है।

तो 3.5 में मुझे लगता है कि आप की तरह कुछ कर सकते हैं:

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
    DateTime.UtcNow, "Eastern Standard Time"); 

लेकिन इस बस 2.0 में मौजूद नहीं है; माफ़ कीजिये।

+3

भले ही वह ओपी की बाधाओं में नहीं था, फिर भी उसने मेरे प्रश्न का उत्तर दिया, इसलिए मैंने इसे संशोधित किया :) – Chris

+3

धन्यवाद ! मैं बस इसे जोड़ना चाहता हूं: 'ReadOnlyCollection tz = TimeZoneInfo.GetSystemTimeZones(); दिनांक समय पूर्वी = TimeZoneInfo.ConvertTimeBySystemTimeZoneId (DateTime.UtcNow, tz [0] आईडी); ' –

6

से - http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttimefromutc.aspx

यह एक समय क्षेत्र की अनुमति देता है नाम से पाया जा सकता है, इस मामले में अमेरिका कभी 15 डिग्री पश्चिम या पूर्वी लंदन मध्याह्न से तैरता है।

DateTime timeUtc = DateTime.UtcNow; 
try 
{ 
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
    DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone); 
    Console.WriteLine("The date and time are {0} {1}.", 
        cstTime, 
        cstZone.IsDaylightSavingTime(cstTime) ? 
          cstZone.DaylightName : cstZone.StandardName); 
} 
catch (TimeZoneNotFoundException) 
{ 
    Console.WriteLine("The registry does not define the Central Standard Time zone."); 
}       
catch (InvalidTimeZoneException) 
{ 
    Console.WriteLine("Registry data on the Central STandard Time zone has been corrupted."); 
} 
2

मैं आपका समय बचाने और आपको बता .net उचित, 2.0 संस्करण में कोई रास्ता नहीं किसी अन्य समय क्षेत्र है कि सॉफ्टवेयर पर चल रहा है से अलग के लिए दिनांक समय वस्तु प्राप्त करने के लिए है कि वहाँ (अन्य करेंगे यूटीसी से)।

हालांकि, इसका मतलब यह नहीं है कि .NET के बाहर इसे करने का कोई तरीका नहीं है। TimeZoneInformation क्लास पर here देखें। ओ/एस से समय क्षेत्र जानकारी प्राप्त करने के लिए यह कक्षा विन ओ/एस को कुछ पी/आवेषण सामग्री को लपेटती है। जब 2.0 नया था तब मैंने सफलतापूर्वक इसका उपयोग किया और यह बहुत अच्छा काम करता था। जिस साइट पर मैं काम कर रहा था उसे उपयोगकर्ता को हर तारीख/समय स्थानीय दिखाने में सक्षम होना था और उसे डीएसटी-जागरूक होना था, और इस वर्ग ने हमारे लिए बिल भर दिया।

0

एक तारीख तुलना एक तिथि तुलना है सबसे महत्वपूर्ण बिट्स (पूर्वाग्रह और दिन के उजाले) क्रमशः पदों 0 पर संग्रहीत int32s और 8 हैं। डेटटाइम सिर्फ एक मेमोरी स्ट्रक्चर को लपेटता है जिसे टिक्स में परिभाषित किया जाता है और स्मृति के सामान्य रूप से प्रयुक्त हिस्सों तक पहुंचने के तरीकों को बनाता है। दिन हो या साल या समय या TimeOfDay आदि

इसके अलावा रूपांतरण केवल तभी संभव है आप दोनों स्रोत SND गंतव्य ऑफसेट और फिर गणना हमेशा है दिए गए कहाँ कोष्टक में हिस्से का प्रतिनिधित्व करता -1 * (sourceOffset - destOffset)

द्वारा दिया जाता है समय क्षेत्र अंतर।

कृपया यह भी देखना

Get eastern time in c# without converting local time

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