将Double转换为DateTime?

Pau*_*aul 10 c# excel datetime datetime-format

我有一个.CSV文件,我正在读一个C#程序.在其中一列中,有一个日期,但它采用"通用"格式,因此它在.CSV中显示为数字.例如:41172.

如何在C#中将此数字转换为格式为dd/mm/yyyy的日期?41172相当于20/09/2012.

das*_*ash 31

要从"Excel格式"中的DateTime转到C#日期时间,可以使用DateTime.FromOADate函数.

在上面的示例中:

   DateTime myDate = DateTime.FromOADate(41172);
Run Code Online (Sandbox Code Playgroud)

要将其写出以所需格式显示,请使用:

   myDate.ToString("dd/MM/yyyy");
Run Code Online (Sandbox Code Playgroud)

如果您想知道Excel日期处理中的差异来自何处,那么它应该是故意的:

当莲花1-2-3首次发布时,该计划假设1900年是闰年,尽管它实际上不是闰年.这使得程序更容易处理闰年,并且对Lotus 1-2-3中的几乎所有日期计算都没有造成任何损害.

当Microsoft Multiplan和Microsoft Excel发布时,他们还认为1900年是闰年.这允许Microsoft Multiplan和Microsoft Excel使用Lotus 1-2-3使用的相同序列日期系统,并提供与Lotus 1-2-3的更好兼容性.将1900作为闰年处理也使用户更容易将工作表从一个程序移动到另一个程序.

虽然技术上可以纠正这种行为,以便当前版本的Microsoft Excel不会假设1900是闰年,但这样做的缺点超过了优势.

资料来源:http://www.ozgrid.com/Excel/ExcelDateandTimes.htm


Jon*_*eet 14

编辑:正如评论和其他答案中所述,DateTime.FromOADate是一种更好的方法.如果它没有被接受,我会删除这个答案.(但是,仍然有像.NET Core这样的平台FromOADate不受支持,所以它对使用这些平台的人来说仍然有用.)

我怀疑你想要:

DateTime date = new DateTime(1900, 1, 1).AddDays(days - 2);
Run Code Online (Sandbox Code Playgroud)

(有关您需要减去2的原因,请参阅其他答案.)

  • http://msdn.microsoft.com/en-us/library/system.datetime.fromoadate.aspx - "基准日期之前或之后的天数,1899年12月30日午夜" (4认同)