如何将Excel序列date编号转换为.NET DateTime?

如何从Excel序列date转换为.NETdate时间?

例如39938是05/05/2009。

39938是自1/1/1900以来的天数?

在这种情况下,使用这个函数(C#):

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); } 

VB:

 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 

[更新]:
嗯…一个快速testing显示,实际上是两天rest。 不知道在哪里。

好的:现在问题已经解决了。 详情请参阅评论。 尤其是看到build议使用DateTime.FromOADate()来代替。

我发现使用FromOADate方法更简单,例如:

 DateTime dt = DateTime.FromOADate(39938); 

使用这个代码dt是“05/05/2009”。

 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; } 

剪切和粘贴某人的人才…

伊恩布朗

为39938做到这一点:39938 * 864000000000 + 599264352000000000

864000000000表示一天中的刻度数599264352000000000表示从0001年到1900年的刻度数