我有一个双精度数值为40880.051388,如果我在Excel中将其粘贴到单元格中并应用以下自定义格式“m/d/yyyy h:mm
”,那么我会得到"12/3/2011 1:14"
。
如何在C#中进行此解析/转换?我不知道这个值是距某个检查点的毫秒数,比如纪元时间,还是它遵循某种特定的准备好的格式,但Excel是如何得出这个特定值的?在C#中是否也可以做到?
我已经尝试使用Visual Studio中的TimeSpan
、DateTime
和其他类似的东西,但没有取得任何进展。
我有一个双精度数值为40880.051388,如果我在Excel中将其粘贴到单元格中并应用以下自定义格式“m/d/yyyy h:mm
”,那么我会得到"12/3/2011 1:14"
。
如何在C#中进行此解析/转换?我不知道这个值是距某个检查点的毫秒数,比如纪元时间,还是它遵循某种特定的准备好的格式,但Excel是如何得出这个特定值的?在C#中是否也可以做到?
我已经尝试使用Visual Studio中的TimeSpan
、DateTime
和其他类似的东西,但没有取得任何进展。
可以尝试以下方法:
double d = 40880.051388 ;
DateTime dt = DateTime.FromOADate(d);
尝试使用var dateTime = DateTime.FromOADate(40880.051388);
。
如果您需要将其格式化为字符串,请使用dateTime.ToString("M/d/yyyy H:mm", CultureInfo.InvariantCulture)
。这将给您24小时制的字符串(将H
更改为h
可获得12小时制)。
如果您需要比FromOADate
提供的精度更高(1000倍或更多),请参见我在另一个主题中的答案。
new DateTime(1899, 12, 30).AddDays(40880.051388)
以下简单的代码将会运行
DateTime.FromOADate(myDouble)
然而,如果性能至关重要,它可能无法运行得足够快。这个操作非常依赖于处理器,因为OLE自动化日期格式的日期范围始于1899年12月30日,而DateTime始于公历0001年1月1日。
FromOADate调用DoubleDateToTicks函数,使用myDouble作为唯一参数。这将返回滴答数,并使用此值创建一个未指定DateTimeKind的新DateTime。
大部分工作都由mscorlib中的DoubleDateToTicks函数完成。这包括在double的值为NaN时抛出ArgumentException的代码,以及根据您的确切需求进行各种性能优化的多种方式。