(我正在使用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]的日期时间?
答案 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
。