为什么这是一个时间跨度为 100 小时 100 分钟的非合法 OleAut 日期

Why is this a Not a legal OleAut date with a TimeSpan of 100 hours and 100 minutes

我正在尝试从 TimeSpan 创建一个有 100 小时 100 分钟的日期,但我遇到了错误:

Run-time exception (line 9): Not a legal OleAut date.

Stack Trace:

[System.OverflowException: Not a legal OleAut date.] at System.DateTime.TicksToOADate(Int64 value)

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        TimeSpan timeSpan = TimeSpan.FromHours(100) + TimeSpan.FromMinutes(100);
        var OADate = DateTime.FromOADate((DateTime.MinValue.AddTicks(timeSpan.Ticks)).ToOADate());

    }
}

这是为了 link 使用来自 vb6 的数据库中的遗留值。

它适用于较小的小时和分钟值,但失败了,有什么想法吗?

创建了 Fiddle

让我们看看您要转换成的日期 OADate:

TimeSpan timeSpan = TimeSpan.FromHours(100) + TimeSpan.FromMinutes(100);

var OADate = DateTime.MinValue.AddTicks(timeSpan.Ticks);

Console.WriteLine(OADate.ToString("d MMMM yyyy HH:mm:ss", CultureInfo.InvariantCulture));

你会得到这个

5 January 0001 05:40:00

但是根据manual粗体是我的)

The base OLE Automation Date is midnight, 30 December 1899. The minimum OLE Automation date is midnight, 1 January 0100. The maximum OLE Automation Date is the same as DateTime.MaxValue, the last moment of 31 December 9999.

这就是为什么 DateTime.MinValue.AddTicks(timeSpan.Ticks).ToOADate() 非法 (OADate 低于最小值)并且您抛出了异常。