从 FileTime 纪元到 TimeSpan 的 DateTime?

DateTime to TimeSpan from FileTime epoch?

给定代码

var dt = new DateTime(2015, 5, 6);
var ts = dt.Subtract(new DateTime(1601, 1, 1));

考虑到此代码中有一个 new DateTime(1601, 1, 1) 的减法,它是 Windows FileTime 的纪元,是否有更好的方法来实现相同的行为?

在内部,DateTime 表示为以刻度(100 ns 间隔)测量的纪元的偏移量。虽然您的问题并不完全清楚,但您似乎希望将此偏移量作为 TimeSpan(可用于表示以滴答为单位测量的偏移量)。

DateTime 纪元是 0001-01-01 (DateTime.MinValue)。但是,您使用 1601-01-01。这是 Windows 文件时间的纪元,因此要获得与您要求的相同的 TimeSpan,您可以执行以下操作:

var ts = new TimeSpan(DateTime.Now.ToFileTime());

正如 Panagiotis Kanavos 所说,也许您想使用它?

var timeSpan = new TimeSpan(fileTime);

或者您可能想像这样减去 DateTime.FromFileTime(0)

var timeSpan = DateTime.Now.Subtract(DateTime.FromFileTime(0));

或者您正在寻找 Duration 方法?

如果您的 TimeSpan 值为负,它将提供一个绝对值作为 TimeSpan 实例,如下例所示。

var format = "{0,22}{1,22}{2,22}";
var timeSpan = DateTime.Now.Subtract(new DateTime(1601, 1, 1));

Console.Write("TimeSpan: ");
Console.WriteLine(format, timeSpan);
Console.Write("Duration:  ");
Console.WriteLine(format, timeSpan.Duration());

/* Console Output  ------------------
TimeSpan: -00:00:00.1234567
Duration:  00:00:00.1234567
------------------ ------------------ */

不清楚实际问题是什么,所以这是我的猜测:How to convert a file time tick value to a TimeSpan。

Windows 文件时间是自 1600-01-01 以来 100ns 间隔的数量。 TimeSpan 是对滴答的包装,即 100ns 间隔。您可以使用 TimeSpan(Int64) 构造函数从文件时间刻度值创建一个 TimeSpan 对象:

var ts= new TimeSpan(ticks);