मैं एक्सेल सीरियल तिथि से .NET दिनांक समय में कैसे परिवर्तित करूं?मैं एक्सेल सीरियल दिनांक संख्या को .NET डेटटाइम में कैसे परिवर्तित करूं?
उदाहरण के लिए 39 9 38 05/05/2009 है।
मैं एक्सेल सीरियल तिथि से .NET दिनांक समय में कैसे परिवर्तित करूं?मैं एक्सेल सीरियल दिनांक संख्या को .NET डेटटाइम में कैसे परिवर्तित करूं?
उदाहरण के लिए 39 9 38 05/05/2009 है।
जहां 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()
का उपयोग करने की सिफारिश को देखने के लिए देखें।
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;
}
काटें और किसी और प्रतिभा के पेस्ट ...
मैं इसे सरल FromOADate method का उपयोग कर पाते हैं, उदाहरण के लिए:
DateTime dt = DateTime.FromOADate(39938);
डीटी है इस कोड का उपयोग करना "2009/05/05"।
+1 यह अन्य उत्तरों की तुलना में अधिक सुरुचिपूर्ण लगता है ... –
यह समय मानों (अंतर्निहित डेटा प्रारूप में फ़्लोटिंग पॉइंट) के साथ तारीखों को भी संभालता है, जो स्वीकार्य समाधान नहीं करता है। –
@nullptr हालांकि, इसमें केवल 1 मिलीसेकंड की सटीकता है। यदि आप परवाह करते हैं तो आप बहुत अधिक सटीकता प्राप्त कर सकते हैं। [मेरा जवाब कहीं और] देखें (http://stackoverflow.com/a/13922172/1336654)। –
39938 के लिए ऐसा करते हैं: 39938 * 864000000000 + 599264352000000000
864000000000 एक दिन में टिक की संख्या का प्रतिनिधित्व करता है 599264352000000000 वर्ष दर वर्ष 0001 से टिक की संख्या का प्रतिनिधित्व करता है 1900
मैं जानता हूँ कि 1 दिन के लिए है कमल 02/29/1900 के बारे में एक बग है, यह एक दिन के रूप में था जो अस्तित्व में नहीं है। मुझे नहीं पता कि दूसरा दिन क्या है। –
वीबीए तिथियां (एक्सेल) 12/30/1899 –
से शुरू होती है यदि आप 2 घटाते हैं तो यह काम करता है, लेकिन यह कम से कम 60 (02/29/1900) की सीरियल तिथियों और वहां दूसरे चुपके दिन की विफलता के लिए विफल रहता है। –