2009-04-07 6 views

उत्तर

53

जहां 39 9 38 1/1/1900 से दिनों की संख्या है?

उस मामले में, (सी #) इस समारोह का उपयोग करें:

public static DateTime FromExcelSerialDate(int SerialDate) 
{ 
    if (SerialDate > 59) SerialDate -= 1; //Excel/Lotus 2/29/1900 bug 
    return new DateTime(1899, 12, 31).AddDays(SerialDate); 
} 

वीबी:

Public Shared Function FromExcelSerialDate(ByVal SerialDate As Integer) As DateTime 
    If SerialDate > 59 Then SerialDate -= 1 ''// Excel/Lotus 2/29/1900 bug 
    Return New DateTime(1899, 12, 31).AddDays(SerialDate) 
End Function 

[अपडेट]:
हम्म ... के एक त्वरित परीक्षण जो दिखाता है कि यह वास्तव में दो दिन बंद है। निश्चित नहीं है कि अंतर कहां है।

ठीक है: समस्या अब तय की गई है। विवरण के लिए टिप्पणियां देखें। विशेष रूप से DateTime.FromOADate() का उपयोग करने की सिफारिश को देखने के लिए देखें।

+1

मैं जानता हूँ कि 1 दिन के लिए है कमल 02/29/1900 के बारे में एक बग है, यह एक दिन के रूप में था जो अस्तित्व में नहीं है। मुझे नहीं पता कि दूसरा दिन क्या है। –

+0

वीबीए तिथियां (एक्सेल) 12/30/1899 –

+0

से शुरू होती है यदि आप 2 घटाते हैं तो यह काम करता है, लेकिन यह कम से कम 60 (02/29/1900) की सीरियल तिथियों और वहां दूसरे चुपके दिन की विफलता के लिए विफल रहता है। –

1
void ExcelSerialDateToDMY(int nSerialDate, int &nDay, 
          int &nMonth, int &nYear) 
{ 
    // Excel/Lotus 123 have a bug with 29-02-1900. 1900 is not a 
    // leap year, but Excel/Lotus 123 think it is... 
    if (nSerialDate == 60) 
    { 
     nDay = 29; 
     nMonth = 2; 
     nYear = 1900; 

     return; 
    } 
    else if (nSerialDate < 60) 
    { 
     // Because of the 29-02-1900 bug, any serial date 
     // under 60 is one off... Compensate. 
     nSerialDate++; 
    } 

    // Modified Julian to DMY calculation with an addition of 2415019 
    int l = nSerialDate + 68569 + 2415019; 
    int n = int((4 * l)/146097); 
      l = l - int((146097 * n + 3)/4); 
    int i = int((4000 * (l + 1))/1461001); 
     l = l - int((1461 * i)/4) + 31; 
    int j = int((80 * l)/2447); 
    nDay = l - int((2447 * j)/80); 
     l = int(j/11); 
     nMonth = j + 2 - (12 * l); 
    nYear = 100 * (n - 49) + i + l; 
} 

काटें और किसी और प्रतिभा के पेस्ट ...

Ian Brown

133

मैं इसे सरल FromOADate method का उपयोग कर पाते हैं, उदाहरण के लिए:

DateTime dt = DateTime.FromOADate(39938); 

डीटी है इस कोड का उपयोग करना "2009/05/05"।

+4

+1 यह अन्य उत्तरों की तुलना में अधिक सुरुचिपूर्ण लगता है ... –

+2

यह समय मानों (अंतर्निहित डेटा प्रारूप में फ़्लोटिंग पॉइंट) के साथ तारीखों को भी संभालता है, जो स्वीकार्य समाधान नहीं करता है। –

+0

@nullptr हालांकि, इसमें केवल 1 मिलीसेकंड की सटीकता है। यदि आप परवाह करते हैं तो आप बहुत अधिक सटीकता प्राप्त कर सकते हैं। [मेरा जवाब कहीं और] देखें (http://stackoverflow.com/a/13922172/1336654)। –

1

39938 के लिए ऐसा करते हैं: 39938 * 864000000000 + 599264352000000000

864000000000 एक दिन में टिक की संख्या का प्रतिनिधित्व करता है 599264352000000000 वर्ष दर वर्ष 0001 से टिक की संख्या का प्रतिनिधित्व करता है 1900

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