14

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

如何在 C# 中进行此解析/转换?我不知道该值是否是某个检查点的毫秒数,例如纪元时间,或者该值是否采用某种特定的准备格式,但是 excel 是如何得出这个特定值的?可以在 C# 中完成吗?

我已经尝试在 Visual Studio 中使用TimeSpanDateTime和其他类似的东西,但没有得到任何结果。

4

5 回答 5

34

看起来您正在使用旧的OLE 自动化 date。利用

DateTime.FromOADate(myDouble)
于 2012-12-17T18:15:23.113 回答
4

尝试这样的事情: -

double d = 40880.051388 ;
DateTime dt = DateTime.FromOADate(d);
于 2012-12-17T18:14:23.253 回答
3

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

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

如果您需要比 提供的精度更高(1000 倍或更多)FromOADate,请参阅我在另一个线程中的回答

于 2012-12-17T18:15:27.920 回答
2

该值是从 1899 年 12 月 30 日开始的天数偏移量。所以你想要:

new DateTime(1899, 12, 30).AddDays(40880.051388)
于 2012-12-17T18:14:33.787 回答
0

以下简单代码将起作用

DateTime.FromOADate(myDouble)

但是,如果性能很关键,它可能运行得不够快。此操作非常占用处理器资源,因为 OLE 自动化日期格式的日期范围从 1899 年 12 月 30 日开始,而 DateTime 在公历中从 0001 年 1 月 1 日开始。

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

大部分工作由 mscorlib 中的 DoubleDateToTicks 函数完成。这包括当 double 的值为 NaN 时引发 ArgumentException 的代码,并且有多种方法可以根据您的确切需求优化性能。

于 2016-04-06T13:49:26.620 回答