2011-01-21 11 views
7

मैं सी # में एक फ़ंक्शन लिखना चाहता हूं (या यदि यह पहले से बाहर निकलता है तो इसका उपयोग करें) जो अगले डीएसटी संक्रमण की तिथि/समय System.TimeZoneInfo ऑब्जेक्ट देता है और उस समय क्षेत्र में एक विशेष "के रूप में" समय। लौटाया गया समय प्रदान किए गए समय क्षेत्र में होना चाहिए। समारोह मैं चाहता हूँ इस हस्ताक्षर है:अगली तारीख/समय प्राप्त करें जिस पर डेलाइट सेविंग टाइम संक्रमण होता है

public DateTime GetNextTransition(DateTime asOfTime, TimeZoneInfo timeZone) 
{ 
    // Implement me! 
} 

उदाहरण के लिए, अगर मैं "पूर्वी मानक समय" TimeZoneInfo वस्तु में पारित, और 1/21/2011 @ 17: 00 "asOfTime" के रूप में, मैं इस उम्मीद 3/13/2011 @ 2: 00 वापस करने के लिए समारोह।

System.TimeZoneInfo.TransitionTime संरचना में मुझे आवश्यक सभी जानकारी दिखाई देती है, लेकिन आदर्श रूप से नियम को वास्तविक तिथि में बदलने के लिए कुछ प्रकार के अंतर्निर्मित तंत्र होंगे। किसी के पास कोई सुझाव है?

+0

डीएसटी एक बहुत ही जानवर है ... ध्यान रखें कि एरिज़ोना के बहुमत (कुछ भारतीय आरक्षण सम्मान डीएसटी) डीएसटी का सम्मान नहीं करते हैं। हमारा टाइमज़ोन एमएसटी बनी हुई है और इस प्रकार हम अपने समय को समायोजित नहीं करते हैं ... जबकि डेनवर एमडीटी में संक्रमण करेगा और अपना समय समायोजित करेगा। –

+0

नोडा समय का उपयोग करें और देखें [यह धागा] (http://stackoverflow.com/questions/24373618/getting-daylight-savings-time-start-and-end-in-nodatime) इसका उपयोग करके संक्रमण समय कैसे प्राप्त करें। – Azimuth

उत्तर

6

इस पृष्ठ पर उदाहरण देखें, मुझे लगता है कि आपको यह चाहिए कि आपको क्या चाहिए।

MSDN - TransitionTime

+0

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

+3

@StuartLange मैं पिछले 4.5 वर्षों में हर मिनट के लिए यहां गया हूं, आप अपना कोड पोस्ट करने का इंतजार कर रहे हैं। अभी तक उस पर कार्य कर रहा हूं? – Nissim

+0

ध्यान दें कि 'TransitionTimeToDateTime' नामक एक आंतरिक विधि है जो यह करती है। आप इसे [.NET संदर्भ स्रोत] में ढूंढ सकते हैं (http://referencesource.microsoft.com/#mscorlib/system/timezoneinfo.cs,8605eb2eb5309ae8)। –

0

System.TimeZoneInfo.TransitionTime एक संरचना की तरह दिखता है जो ऐसे समय संक्रमण डेटा को पकड़ सकता है, न कि वास्तविक मानों को दर्शाता है। ऐसा फ़ंक्शन बनाने के लिए, मुझे कहीं भी डेटा मिल जाएगा, फिर स्थिर CreateFloatingDateRule या CreateFixedDateRule विधियों का उपयोग करके मान बनाएं।

2

वहाँ Hello_। यह बहुत देर हो सकती है लेकिन मैं यहां इस कोड के लिए इस्तेमाल किया गया कोड पोस्ट करूंगा। यह संभवतः इसे लागू करने के लिए किसी के समय को सुरक्षित कर सकता है। मैंने वास्तव में लिंक की मदद से यह किया है @ jamiegs उत्तर है।

public static DateTime? GetNextTransition(DateTime asOfTime, TimeZoneInfo timeZone) 
    { 
     TimeZoneInfo.AdjustmentRule[] adjustments = timeZone.GetAdjustmentRules(); 
     if (adjustments.Length == 0) 
     { 
      // if no adjustment then no transition date exists 
      return null; 
     } 

     int year = asOfTime.Year; 
     TimeZoneInfo.AdjustmentRule adjustment = null; 
     foreach (TimeZoneInfo.AdjustmentRule adj in adjustments) 
     { 
      // Determine if this adjustment rule covers year desired 
      if (adj.DateStart.Year <= year && adj.DateEnd.Year >= year) 
      { 
       adjustment = adj; 
       break; 
      } 
     } 

     if (adjustment == null) 
     { 
      // no adjustment found so no transition date exists in the range 
      return null; 
     } 


     DateTime dtAdjustmentStart = GetAdjustmentDate(adjustment.DaylightTransitionStart, year); 
     DateTime dtAdjustmentEnd = GetAdjustmentDate(adjustment.DaylightTransitionEnd, year); 


     if (dtAdjustmentStart >= asOfTime) 
     { 
      // if adjusment start date is greater than asOfTime date then this should be the next transition date 
      return dtAdjustmentStart; 
     } 
     else if (dtAdjustmentEnd >= asOfTime) 
     { 
      // otherwise adjustment end date should be the next transition date 
      return dtAdjustmentEnd; 
     } 
     else 
     { 
      // then it should be the next year's DaylightTransitionStart 

      year++; 
      foreach (TimeZoneInfo.AdjustmentRule adj in adjustments) 
      { 
       // Determine if this adjustment rule covers year desired 
       if (adj.DateStart.Year <= year && adj.DateEnd.Year >= year) 
       { 
        adjustment = adj; 
        break; 
       } 
      } 

      dtAdjustmentStart = GetAdjustmentDate(adjustment.DaylightTransitionStart, year); 
      return dtAdjustmentStart; 
     } 
    } 


    public static DateTime GetAdjustmentDate(TimeZoneInfo.TransitionTime transitionTime, int year) 
    { 
     if (transitionTime.IsFixedDateRule) 
     { 
      return new DateTime(year, transitionTime.Month, transitionTime.Day); 
     } 
     else 
     { 
      // For non-fixed date rules, get local calendar 
      Calendar cal = CultureInfo.CurrentCulture.Calendar; 
      // Get first day of week for transition 
      // For example, the 3rd week starts no earlier than the 15th of the month 
      int startOfWeek = transitionTime.Week * 7 - 6; 
      // What day of the week does the month start on? 
      int firstDayOfWeek = (int)cal.GetDayOfWeek(new DateTime(year, transitionTime.Month, 1)); 
      // Determine how much start date has to be adjusted 
      int transitionDay; 
      int changeDayOfWeek = (int)transitionTime.DayOfWeek; 

      if (firstDayOfWeek <= changeDayOfWeek) 
       transitionDay = startOfWeek + (changeDayOfWeek - firstDayOfWeek); 
      else 
       transitionDay = startOfWeek + (7 - firstDayOfWeek + changeDayOfWeek); 

      // Adjust for months with no fifth week 
      if (transitionDay > cal.GetDaysInMonth(year, transitionTime.Month)) 
       transitionDay -= 7; 

      return new DateTime(year, transitionTime.Month, transitionDay, transitionTime.TimeOfDay.Hour, transitionTime.TimeOfDay.Minute, transitionTime.TimeOfDay.Second); 
     } 
    } 

नमूना उपयोग इस तरह दिखेगा:

// This should give you DateTime object for date 26 March 2017 
// because this date is first transition date after 1 January 2017 for Central Europe Standard Time zone 
DateTime nextTransitionDate = GetNextTransition(new DateTime(2017, 1, 1), TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time")) 

आप कोड है कि मैं here के साथ खेला पा सकते हैं।

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