2015-06-25 18 views
5

मेरे पास एक बहुत ही सरल डेटटाइम ऑब्जेक्ट है जो 01-01-0001 दिनांक पर सेट है। मुझे दिनों में, इस डेटटाइम में जोड़ने के लिए एक मूल्य प्रदान किया गया है। मैं अपने परिणामों में एक अप्रत्याशित ऑफसेट देख रहा हूं, हालांकि, दो दिनों के। के इतने की तरह) मैं AddDays के परिणामों को मुद्रित नाटक (कहते हैं, करते हैं:सी # डेटटाइम ऐडडे अप्रत्याशित ऑफ़सेट

DateTime myDateTime = DateTime.Parse("01-01-0001 00:00:00"); 
Console.WriteLine(myDateTime.AddDays(735768.0)); 
ऊपर देखा मूल्य के साथ

(735768.0) मैं की "2015/06/18 12:00:00 AM" एक निर्गम उम्मीद । हालांकि, इसके बजाय मुझे "6/20/2015 12:00:00 पूर्वाह्न" मिलता है। जब मैं निम्नलिखित वेबसाइट पर जाएं और 01-01-0001 के बीच के दिनों में अवधि की गणना -> 2015/06/18 मैं 735,768 दिनों के मूल्य मिलता है, के रूप में उम्मीद:

http://www.timeanddate.com/date/durationresult.html?m1=01&d1=01&y1=0001&m2=06&d2=18&y2=2015

मैं कर रहा हूँ कुछ गड़बड़ है, या क्या हुड के नीचे कुछ चल रहा है जिसके बारे में मुझे पता नहीं है?

यदि आप सोच रहे हैं, तो 735,768 उस डेटा के पहले समय मूल्य का प्रतिनिधित्व करता है जिसके साथ मैं काम कर रहा हूं। डेटा 06/18/2015 00:00:00 से शुरू होने की उम्मीद है।

संपादित करें: मुझे ध्यान रखना चाहिए कि मैंने केवल उस विशेष वेबसाइट को एक विवादित स्रोत के उदाहरण के रूप में प्रदान किया है। सरकारी मौसम एजेंसी समेत अन्य वेबसाइटें मुझे सभी से डेटा प्राप्त करती है 06-18-2015। इसका मतलब यह नहीं है कि सी # गलत है। मैं इतनी उत्सुक हूं कि यह ऑफसेट कहां से आया, और क्यों।

+0

आप लीप वर्ष considerated था।? –

+0

क्यों डेटटाइम स्टोर न करें? लीप साल शायद? इसे आज़माएं और देखें कि आपको क्या मिलता है: 'टाइमस्पेन diff = नया डेटटाइम (2015, 6, 15) - myDateTime;' और 'diffotalDays 'मान देखें। –

+4

आप उस तारीख का मूल्य क्यों उम्मीद करते हैं? क्योंकि दूसरी वेबसाइट ने ऐसा कहा है, या क्योंकि आपने इसकी गणना की है? क्या होगा यदि यह वेबसाइट गलत है और 'AddDays' फ़ंक्शन नहीं है? क्या आपने कई स्रोतों के माध्यम से पुष्टि की है? – Kritner

उत्तर

5

Timeanddate.com खाते में कैलेंडर जो विसंगति बताते ग्रेगोरियन को जूलियन से परिवर्तन, ले जा रहा है।

आप वास्तव में अगर आप timeanddate.com पर 01/01/1752 and 01/01/1753 के बीच अंतर को देखने के इस परिवर्तन होते हैं देख सकते हैं:

Dates and times. They're crazy!

  • जूलियन कैलेंडर पर छलांग साल के लिए सूत्र "है हर साल से विभाज्य 4 "। इसका मतलब है कि जब कैलेंडर बदलता है, तो वर्ष 1 और वर्ष 1752 के बीच timeanddate.com की गणना में और अधिक छलांग वर्ष होते हैं। यह 1753 तक 11 दिनों तक .NET की गणना करता है।
  • Until 1752, इंग्लैंड और संयुक्त राज्य अमेरिका के पूर्वी तट ने Julian Calendar का उपयोग किया। इस परिवर्तन का एक परिणाम यह है कि 1752 केवल 355 दिन लंबा था। यह गणना .NET की गणना द्वारा नहीं ली जाती है, और इस बिंदु पर, .NET की गणना दो दिन आगे है।

this answer by Jon Skeet के अनुसार, DateTime अनिवार्य रूप से ग्रेगोरियन कैलेंडर का उपयोग करता है। यही कारण है कि उपरोक्त subtleties .NET की गणना में परिलक्षित नहीं होते हैं।

0

वेबसाइट से "यह प्रारंभ तिथि से लेकर अंतिम तिथि तक 735,768 दिन है, लेकिन अंतिम तिथि सहित नहीं है"। इससे मुझे लगता है कि वेबसाइट को प्रारंभ तिथि की गणना करने के बाद आपको वास्तव में 735,767 दिन जोड़ना होगा। लेकिन यह केवल एक अतिरिक्त दिन समझाएगा। शायद वेबसाइट एक दिन गलत है? उनके पास चेतावनी है।

-1

यदि यह लीप साल थे तो यह 2 दिनों से अधिक होगा, यदि यह मामला था तो यह 503 दिन बंद होगा। मेरे दिमाग में दो विकल्पों में से एक है, या तो ए। कैलकुलेटर जो आप ऑनलाइन उपयोग कर रहे हैं वह थोड़ा सा बंद है, या उस गणित का उपयोग करने वाला गणित उस पैमाने पर गलत है। यदि आप स्वयं गणित करते हैं तो आप देखेंगे कि 735,768/365 पूरी तरह से तर्कहीन संख्या में आता है। तो मेरी सोच यह है कि हुड के नीचे चलने वाले गणित में त्रुटिपूर्णता उन दिनों के लिए सटीक नहीं रह सकती है। यह दशमलव बिंदुओं के साथ ALOT होता है, मुझे लगता है कि सी # शायद दशमलव बिंदुओं को छोटा कर रहा है (इसे गोल कर रहा है) और इसलिए आप दो दिन दूर हैं। वैसे भी मेरा अनुमान है।

+0

यह देखते हुए कि किसी दिए गए युग के बाद से .NET डेटटाइम्स आंतरिक रूप से 100ns अंतराल की संख्या के रूप में दर्शाए जाते हैं, यह अपेक्षाकृत असंभव लगता है। (इसके अलावा, साल लगभग 365.2425 दिन लंबा हैं।) –

+0

"मेरा अनुमान", मैंने यह नहीं कहा कि यह क्या हो रहा था। स्पष्ट रूप से इस साइट पर आप जो कुछ भी कहते हैं, उसके लिए आपको प्रतिनिधि ले लिया जाता है। इनपुट देने के लिए लोगों को प्रेरित करने का एक शानदार तरीका है। –

+0

आम तौर पर, अनुमान अनुमान लगाने के लिए खराब-उपयुक्त होते हैं; इसके लिए हमारे पास टिप्पणियां हैं। उत्तर अपेक्षाकृत आधिकारिक माना जाता है। –

4

.NET आपको "सही" उत्तर दे रहा है - यह नोट करते हुए कि "सही" पूरी तरह से ग्रेगोरियन कैलेंडर मान रहा है क्योंकि एंड्रयू व्हिटकर नीचे दी गई टिप्पणियों में बताता है और ऊपर जवाब देता है। एंड्रयू का जवाब अधिक सही है।

एक लीप वर्ष को 4 से विभाजित के रूप में परिभाषित किया जा सकता है, लेकिन 100 तक विभाजित नहीं किया जाता है जब तक कि यह 400 तक विभाजित न हो। इसलिए, 1/1/0001 उन नियमों के बाद, 488 लीप दिन रहे हैं।

इन छलांग दिनों के लिए लेखांकन, 2014 के अंत तक 1/1/0001 से 735,598 दिन रहे हैं। इससे हमें 2015 का दिन # 170 मिल जाएगा, जो 6/20/2015 (31 + 28 + 31 + 30 + 31 + 20)।

इसके अलावा, यह .NET में एक गोल करने वाला मुद्दा नहीं है जैसा कि कुछ ने सुझाव दिया है। चूंकि DateTime.AddDays टिकों का उपयोग करता है, जो long डेटा प्रकार 64-बिट हस्ताक्षर किए गए इनट्स के रूप में हैं, कोई ओवरफ़्लो या राउंडिंग नहीं हो रहा है।

Ticks/day = 864BB (or 8.64 x 10^11) 
Tick/(2,015 years) ~ 1.75 x 10^15 
Max long = 9,223,372,036,854,775,807 (or 9.22 x 10^18) 
+2

उत्तर "सही" है यदि आप मानते हैं कि लीप वर्ष की गणना केवल ग्रेगोरियन कैलेंडर नियमों के साथ की जाती है। इसे गलत माना जा सकता है क्योंकि प्रश्न में तिथि सीमा में एकाधिक कैलेंडर सिस्टम का उपयोग किया गया था। –

0

आप नीचे दिए गए कोड चलाते हैं तो आप वहाँ साल 100,200 ...... 1900

यदि आप लिंक के माध्यम से जाने के लिए आप साल 100,200 के लिए फरवरी में 29days मिलेगा के लिए फरवरी में केवल 28 दिन हैं पा सकते हैं .. ..

http://www.timeanddate.com/calendar/?year=100&country=1

इसका बेहतर Timeanddate.com को .net तारीख दिन की तुलना करने के लिए नहीं।

कोड:

static void Main(string[] args) 
     {   
      for (int i = 001; i <= 2015; i++) 
      { 
       if (i % 4 == 0) 
       {      
        if (DateTime.DaysInMonth(i, 2) != 29) 
        { 
         Console.WriteLine("Days {0} in a month feb Year {1}..", DateTime.DaysInMonth(i, 2), i); 
        } 
       } 
      } 
      Console.ReadLine(); 
     } 

उत्पादन: -

Days 28 in a month feb Year 100.. 
Days 28 in a month feb Year 200.. 
Days 28 in a month feb Year 300.. 
Days 28 in a month feb Year 500.. 
Days 28 in a month feb Year 600.. 
Days 28 in a month feb Year 700.. 
Days 28 in a month feb Year 900.. 
Days 28 in a month feb Year 1000.. 
Days 28 in a month feb Year 1100.. 
Days 28 in a month feb Year 1300.. 
Days 28 in a month feb Year 1400.. 
Days 28 in a month feb Year 1500.. 
Days 28 in a month feb Year 1700.. 
Days 28 in a month feb Year 1800.. 
Days 28 in a month feb Year 1900.. 
संबंधित मुद्दे