【问题标题】:How to convert a double value to a DateTime in c#?如何在 C# 中将双精度值转换为 DateTime?
【发布时间】:2012-12-04 20:56:17
【问题描述】:

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

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

我尝试在 Visual Studio 中使用 TimeSpanDateTime 和其他类似的东西,但没有成功。

【问题讨论】:

标签: c# excel datetime converter timespan


【解决方案1】:

试试这样的:-

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你说得对,我忘了他们以 1899 年 12 月 30 日为起点。奇怪的 Excel 人。固定。
    • @EricLippert 非常正确。但它也失去了精度,因为参数被四舍五入/截断到最接近的毫秒。你知道为什么框架总是像那样丢掉精度吗?这没有道理。我刚刚写了a long answer in another thread,希望您能阅读。
    【解决方案3】:

    看起来您使用的是旧的OLE Automation date。使用

    DateTime.FromOADate(myDouble)
    

    【讨论】:

    【解决方案4】:

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

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

    如果您需要比FromOADate 提供的精度更高(1000 倍或更高),请参阅my answer in another thread

    【讨论】:

      【解决方案5】:

      下面的简单代码将起作用

      DateTime.FromOADate(myDouble)
      

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 2021-09-12
        • 2019-02-24
        • 2014-06-03
        相关资源
        最近更新 更多