如何将一个double值转换为c#中的DateTime?
我有值40880.051388,并将其存储为一个双精度,如果我打开Excel并粘贴到单元格中,并将下面的自定义格式“ m/d/yyyy h:mm"
应用于该单元格,则得到"12/3/2011 1:14"
我怎样才能在C#中parsing/转换? 我不知道这个值是从某个特定的检查点开始的毫秒数,比如epoch时间,或者这个值是否是某种特定的准备格式,但是excel是如何得出这个特定值的? 可以在C#中完成吗?
我试过用TimeSpan
, DateTime
和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的代码,并且根据您的确切需要,可以通过多种方式进行性能优化。