如何转换自定义时间" ticks"到TDateTime?

时间:2016-02-18 10:16:50

标签: c++ datetime

(我正在使用C ++ Builder 2006,如果这很重要)

我无法解决这个问题:

我有什么(我无法改变这一点):

typedef struct {
    uint16_t Leaps; // How many Leaps from the previous event (see below)
    uint16_t Ticks; // Event "machine ticks" (see below)
    uint16_t Code;
} sMachineEvents;

typedef struct {
    TDateTime Date;
    uint16_t Code;
} sConvertEvents;

TDateTime Sync // Contains the date and time of Ev1
TICKS_PER_SECOND // #defined elsewhere: How many Ticks in a second
TICKS_PER_LEAP // #defined elsewhere: How many ticks to make a "Leap"
               // (this means that when the Tick counter reaches TICKS_PER_LEAP
               //  it becomes 0 and the Leaps counter increases by 1)


sMachineEvents Ev[3];
sConvertEvents cEv[3];

Ev[0].Leaps = 0x0005;
Ev[0].Ticks = 0x5975;
Ev[0].Code  = 0x0001;

Ev[1].Leaps = 0x0001;
Ev[1].Ticks = 0x0124;
Ev[1].Code  = 0x0002;

Ev[2].Leaps = 0x0000;
Ev[2].Ticks = 0x70AC;
Ev[2].Code  = 0x0003;

我需要"转换"这些" MachineEvents" in" ConvertEvents"。 第一个很简单:

cEv[0].Date = Sync;
cEv[0].Code = Ev[0].Code;

现在:Ev [1]发生在Ev [0]之前。

多少钱?我需要及时回到"通过Ev [0] .Leaps + Ev [0]。嘀嗒然后去"及时前进"由Ev [1] .Ticks。

Ev [2]是相同的:它发生了

Ev[1].Leaps + Ev[1].Ticks - Ev[2].Ticks

在Ev之前[1] ....

我该如何计算Ev [1]和Ev [2]的日期时间?

2 个答案:

答案 0 :(得分:1)

如果我理解你是对的,你可以比较" ticks"用"时间"。 您必须按时间格式转换刻度,由tick_count / TICKS_PER_SECOND

完成

所以float Seconds = Tick / TICKS_PER_SECOND。因为它是一个浮点数,你最好使用毫秒

int ms = (int)(ticks / TICKS_PER_SECOND * 1000);

使用秒(或毫秒),您可以创建一个新的Date对象并添加两个日期对象,或者只是将秒添加到旧日期。

另一种方法是在程序启动后保存所有Ticks,并将其简单地用作"日期参考"。

答案 1 :(得分:1)

TDateTime实际上是一个表示天数的浮点值;一小时由1.0 / 24.0表示,第二小时由1.0 / SecsPerDay表示(SecsPerDay是一个等于60 * 60 * 24 = 86400的常量。)

因此,如果一个刻度是1.0 / TICKS_PER_SECOND秒:

TDateTime TimeAsTDateTime = TimeInTicks / (SecsPerDay * TICKS_PER_SECOND)

此外,我认为您的代码不正确:我认为您需要使用Ev[0].Leaps+Ev[0].Ticks而不是Ev[0].Leaps * TICKS_PER_LEAP + Ev[0].Ticks