2012-03-28 13 views
9

निम्नलिखित कोड दुर्घटनाओं और जलने में एक मान्य डबल परिणाम के साथ दिनांक समय के लिए सेकंड जोड़ने और मुझे समझ नहीं आता क्यों:ArgumentOutOfRangeException

DateTime dt = new DateTime(1970,1,1,0,0,0,0, DateTimeKind.Utc); 
double d = double.Parse("1332958778172"); 

Console.Write(dt.AddSeconds(d)); 

कोई मुझे बता सकते हैं क्या हो रहा है? मैं तो बस यही कारण है कि यह पता लगाने के लिए सक्षम हो नहीं कर पा रहे ...

संपादित

यह मान Salesforce REST API से वापस आता है और से मैं क्या समझ वो यूनिक्स युग समय स्टाम्प है। "टोकन मुद्दा का समय, यूनिक्स युग (00:00:00 यूटीसी 1 जनवरी 1 9 70) के बाद सेकंड की संख्या के रूप में दर्शाया गया।"

समाधान

Salesforce REST API

+0

त्रुटि/अपवाद आपको मिल क्या है:

मैं इसे दिनांक समय के लिए एक विस्तार को लागू करने (अभी भी परीक्षण के चरण में) द्वारा हल किया? – Mathieu

+0

उस डबल वैल्यू के परिणामस्वरूप आप '1332958778172.00000000000004' सेकेंड जोड़ सकते हैं (क्योंकि युगल कैसे प्रबंधित किए जाते हैं) इससे सीमा अपवाद समाप्त हो जाएगा। इसके अलावा यह एक डीटी संभाल सकता है साल की संख्या गुजरता है। – jzworkman

उत्तर

13

जैसा कि अन्य ने कहा है, समस्या यह है कि मूल्य बहुत बड़ा है।

इस पर देखा है, मेरा मानना ​​है कि यह यूनिक्स काल के बाद से मिलीसेकेंड प्रतिनिधित्व करता है, नहीं सेकंड तो आप चाहते हैं:

DateTime dt = new DateTime(1970,1,1,0,0,0,0, DateTimeKind.Utc); 
double d = double.Parse("1332958778172"); // Or avoid parsing if possible :) 
Console.Write(dt.AddMilliseconds(d)); 

या तो उस, या 1000 द्वारा विभाजित AddSeconds कॉल करने से पहले - लेकिन स्पष्ट रूप से है कि डेटा खो देंगे।

+0

से बाहर हैं और आप सही हो सकते हैं, लेकिन सेल्सफोर्स एपीआई का कहना है कि यह * सेकंड * है। http://wiki.developerforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com – Gup3rSuR4c

+0

हाँ, मैंने अभी इसे चेक किया है, यह मिलीसेकंड में है। मैं सेल्सफोर्स से बहुत नफरत करता हूं, हर दिन मेरे जीवन को मुश्किल बनाता है। – Gup3rSuR4c

+1

@ हूपरवेयर: न केवल "2012 में कहीं" लेकिन "आज" जो एक बहुत ही विश्वसनीय डेटा बिंदु लगता है :) –

7

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

डेटटाइम 01/01/0001 00:00:00 से 31/12/9999 23:59:59 का समर्थन करता है।

1332958778172/3600/24/365 की एक साधारण गणना 42267 साल देती है।

+0

आप सही 42k वर्ष रेंज – Mathieu

2
DateTime dt = new DateTime(1970,1,1,0,0,0,0, DateTimeKind.Utc);  
Console.Write(dt.AddSeconds(1332958778172D)); 
कि सिवाय

...

1332958778172/60/60/24/365 = 42,267 साल ... जो दिनांक समय केवल जा सकते हैं ऊपर से 23: 59: 31 दिसंबर, 9999

५९.९९,९९,९९९,
3

मुझे लगता है कि डबल मान वास्तव में बहुत बड़ा है। यह 42,267 साल से अधिक (यदि मेरे गणित सही हैं) का प्रतिनिधित्व करता है, और डेटटाइम। मैक्सवेल्यू 23: 59: 59.9 99 99 99, 31 दिसंबर, 99 99

1

मेरे पास एक समान समस्या थी जहां मुझे डेटाटाइम में कॉन्फ़िगर करने योग्य टाइमपैन जोड़ने की आवश्यकता थी। यदि कॉन्फ़िगरेशन सही नहीं है तो मुझे 'सबसे खराब परिदृश्य' मानना ​​होगा: MaxValue।

/// <summary> 
    /// Removes a timespan from a date, returning MinValue or MaxValue instead of throwing exception when if the resulting date 
    /// is behind the Min/Max values 
    /// </summary> 
    /// <returns></returns> 
    public static DateTime SafeAdd(this DateTime source, TimeSpan value) 
    { 
     // Add or remove ? 
     if (value.Ticks > 0) 
     { 
      // add 
      var maxTicksToAdd = DateTime.MaxValue - source; 
      if (value.Ticks > maxTicksToAdd.Ticks) 
       return DateTime.MaxValue; 
     } 
     else 
     { 
      var maxTicksToRemove = source - DateTime.MinValue; 

      // get the value to remove in unsigned representation. 
      // negating MinValues is impossible because it would result in a value bigger than MaxValue : (-32768 .. 0 .. 32767) 
      var absValue = value == TimeSpan.MinValue ? TimeSpan.MaxValue : -value; 

      if (absValue.Ticks > maxTicksToRemove.Ticks) 
       return DateTime.MinValue; 
     } 
     return source + value; 
    } 
संबंधित मुद्दे