从FileTime纪元到TimeSpan的日期时间?

时间:2017-11-08 10:18:11

标签: c# datetime timespan

给出代码

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

在此代码中考虑减去new DateTime(1601, 1, 1)这是Windows FileTime的时代,是否有更好的方法来实现相同的行为?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

正如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
------------------ ------------------ */

答案 2 :(得分:1)

目前还不清楚实际问题是什么,所以我的猜测是:如何将文件时间刻度值转换为TimeSpan。

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

var ts= new TimeSpan(ticks);