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

Dav*_*rab 70 .net excel datetime

如何从excel序列日期转换为.NET日期时间?

例如39938是05/05/2009.

Nar*_*vet 160

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

DateTime dt = DateTime.FromOADate(39938);
Run Code Online (Sandbox Code Playgroud)

使用此代码dt是"05/05/2009".

  • 这也处理具有时间值的日期(基础数据格式中的浮点),接受的解决方案不会. (2认同)

Joe*_*orn 78

39938是自19/1年1月1日以来的天数?

在这种情况下,请使用框架库函数DateTime.FromOADate().
此函数封装了所有细节,并进行边界检查.

对于它的历史价值,这是一个可能的实现:

(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);
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

[更新]:
嗯......快速测试表明它实际上是休息两天.不确定区别在哪里.

好的:问题现在解决了.有关详细信息,请参阅注释

  • -1用于复制已在.NET Framework中解决的内容(DateTime.FromOADate). (25认同)
  • 虽然我同意FROMOADate方法更好,但我仍然发现这个答案提供了丰富的信息. (5认同)
  • 有关FromOADate的更多信息,请参阅http://msdn.microsoft.com/en-us/library/system.datetime.fromoadate.aspx (4认同)
  • 我认为你通过这种转换得到2天太多了,即纪元日期必须移回DateTime(1899,12,30).这是由于我假设Excel的闰年错误. (3认同)
  • 哎呀,其他人都比较快;-)是的,这个bug最初来自Lotus,正如Joel所解释的那样:http://www.joelonsoftware.com/items/2006/06/16.html (2认同)