如何将一个double值转换为c#中的DateTime?

我有值40880.051388,并将其存储为一个双精度,如果我打开Excel并粘贴到单元格中,并将下面的自定义格式“ m/d/yyyy h:mm"应用于该单元格,则得到"12/3/2011 1:14"

我怎样才能在C#中parsing/转换? 我不知道这个值是从某个特定的检查点开始的毫秒数,比如epoch时间,或者这个值是否是某种特定的准备格式,但是excel是如何得出这个特定值的? 可以在C#中完成吗?

我试过用TimeSpanDateTime和Visual Studio中的其他类似的东西,但没有得到任何地方。

看起来像你正在使用旧的OLE自动化date 。 使用

 DateTime.FromOADate(myDouble) 

尝试这样的事情:

 double d = 40880.051388 ; DateTime dt = DateTime.FromOADate(d); 

该值是从1899年12月30日起的一个时间偏移。所以你想要:

 new DateTime(1899, 12, 30).AddDays(40880.051388) 

尝试使用var dateTime = DateTime.FromOADate(40880.051388);

如果您需要将其格式化为string,请使用dateTime.ToString("M/d/yyyy H:mm", CultureInfo.InvariantCulture) 。 这将给你24小时的string(将H更改为h为12小时系统)。

如果您需要比FromOADate更高的精确度(1000倍或更多),请在另一个线程中查看我的答案 。

以下简单的代码将工作

 DateTime.FromOADate(myDouble) 

但是,如果性能至关重要,则运行速度可能不够快。 由于OLE自动化date格式的date范围从1899年12月30日开始,而date时间从公历1月1日0001开始,所以此操作处理器密集型。

FromOADate使用myDouble作为唯一参数调用DoubleDateToTicks函数。 这将返回滴答的数量,并且此值用于创build具有未指定DateTimeKind的新DateTime。

这个工作的大部分是通过mscorlib中的DoubleDateToTicks函数完成的。 这包括当double的值是NaN时抛出一个ArgumentException的代码,并且根据您的确切需要,可以通过多种方式进行性能优化。