如何在c#中将双精度值转换为日期时间?

如何在c#中将双精度值转换为日期时间?,c#,excel,datetime,converter,timespan,C#,Excel,Datetime,Converter,Timespan,我有值40880.051388,并将其存储为双精度,如果我打开Excel并粘贴到单元格中,并将以下自定义格式“m/d/yyyy h:mm”应用于该单元格,我将得到“12/3/2011 1:14” 如何在C#中进行此解析/转换?我不知道这个值是从某个检查点算起的毫秒数,比如纪元时间,还是某个特定格式的值,但是excel是如何得出这个特定值的?能用C语言完成吗 我曾尝试在Visual Studio中使用时间跨度、日期时间,以及其他类似的东西,但没有取得任何进展。尝试以下方法:- double d =

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

如何在C#中进行此解析/转换?我不知道这个值是从某个检查点算起的毫秒数,比如纪元时间,还是某个特定格式的值,但是excel是如何得出这个特定值的?能用C语言完成吗


我曾尝试在Visual Studio中使用
时间跨度
日期时间
,以及其他类似的东西,但没有取得任何进展。

尝试以下方法:-

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)

如果需要将其格式化为字符串,请使用
dateTime.ToString(“M/d/yyyy H:mm”,CultureInfo.InvariantCulture)
。这将为您提供24小时字符串(对于12小时系统,将
H
更改为
H


如果您需要比OADATE提供的更高的精度(因子1000或更高),请参阅。

以下简单代码将起作用

DateTime.FromOADate(myDouble)
但是,如果性能非常关键,它可能运行得不够快。由于OLE Automation日期格式的日期范围从1899年12月30日开始,而DateTime从公历的0001年1月1日开始,因此此操作非常占用处理器

FromOADate使用myDouble作为唯一参数调用DoubleDateToTicks函数。返回刻度数,该值用于创建具有未指定DateTimeKind的新DateTime


这项工作的大部分是由mscorlib中的DoubleDateToTicks函数完成的。这包括当double的值为NaN时抛出ArgumentException的代码,并且有许多方法可以根据您的具体需要对其进行性能优化。

可能会帮助您:如果您不知道数字实际上代表什么,您如何知道Excel选择的格式是正确的?在考虑如何编程之前,你应该知道该数字实际对应的日期,并确定该数字在逻辑上代表的是什么。可能重复的你是对的,我忘了他们使用1899年12月30日作为起点。奇怪的人。修正了。@EricLippert非常正确。但由于参数被舍入/截断到最接近的毫秒,它也会失去精度。你知道为什么框架总是像那样丢掉精度吗?这毫无意义。我刚刚写了我希望你想读的东西。以下是一些信息的乔尔(不是我)版本:@JoelRondeau我刚刚发现
DateTime.FromOADate
的精度只有1毫秒。如果你在意的话,你可以得到更高的精度。从一根旧线上看。
DateTime.FromOADate(myDouble)