以不同格式获得两次delta

时间:2017-07-10 20:43:40

标签: c# datetime

我有两种不同的时间格式

    dt0 = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(time_0)  //(32-bits)
    dt1 = new DateTime.FromFileTime(time_1)  //(64-bits)

我需要找到这两次之间的差值。有没有办法在不将dt0转换为64位的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

您无需转换任何内容 - 无论您如何创建它们,都是DateTime个对象。找出差异:

TimeSpan span = dt1 - dt0;

注意:internally日期存储为long值,即自{0001} 1月1日午夜12:00:00起已过去的ticks(100纳秒间隔)数字(好吧,刻度线为62位,日期类型为2位)。 Windows文件时间也以刻度来衡量,但它使用不同的起始点 - 公元1601年1月1日午夜12点(美国)协调世界时(UTC)。

var dt0 = new DateTime(1970, 1, 1);
dt0.Ticks // 621355968000000000 ticks number since 12:00:00 midnight, January 1, 0001
dt0.ToFileTime() // 116444664000000000 - I'll use this number later

请注意,从1601年1月1日午夜12点开始的刻度数小于0001年1月1日午夜12:00点的刻度数。

var dt1 = dt0.ToLocal();
dt1.Ticks // 621356040000000000 depends on time zone, mine is + 2 hours measured in ticks
var dt2 = dt1.AddSeconds(1);
dt2.Ticks // 621356040010000000 you have added 1s = 10000000 ticks

在最后一个示例中,我添加了第二个用整数表示的值,它将内部62位刻度值增加了10000000。

反之亦然 - 您可以使用二进制数据或Windows文件时间来初始化DateTime结构:

var dt3 = DateTime.FromFileTime(116444664000000000);

这会为d0提供适当的时区偏移1970-01-01T00:00:00+02:00

答案 1 :(得分:0)

您可以使用TimeSpan对象

TimeSpan TimeDelta = new TimeSpan();
TimeDelta  = dt0 - dt1;