我在WinCE7并获得当前时间,我正在使用GetLocalTime(&systemTime);
。此函数提供当前时间的值。现在,如果毫秒为81
,则会将其显示为81
,因此当我减去两个时间值时会发生错误。例如:time1 : 12:34:13:851
& time2: 12:34:14:81
。现在我需要减去秒和毫秒。所以使用sprintf,我提取秒和毫秒并将它们放入time1
& time2
:
sprintf(time1,"%d.%d",systemTime.wSeconds,systemTime.wMilliseconds)
sprintf(time2,"%d.%d",systemTime.wSeconds,systemTime.wMilliseconds)
我正在使用time1 & time2
将atof
转换为浮动。现在time1为13.851
,time2为14.81
。 time2的毫秒实际上是081
,但它会显示81
,因此在减去它时会将其视为810
,它会给出错误的值。
time2--> 14.810 14.081
time1--> 13.851 13.851
-------- ---------
result 0.959(wrong) 0.23(correct)
因此,为了消除此错误,我想到计算毫秒的数字,如果是2
,则在开始时添加0
。所以我做了:
double digits = (floor (log10 (abs (milliseconds))) + 1); //calculate digits
if(digits == 2) //if milliseconds contains 2 digits, we need to add 0 at starting
{
sprintf(newMS,"0%d",milliseconds); //adding 0 to milliseconds
finalMilliseconds = atoi(newMS); //newMS is in char so converting it into integer and storing the value in finalMilliseconds
}
问题出现在这里。让我们说milliseconds = 18
,newMS = 018
,finalMilliseconds
再次18
。
请建议任何其他转换方式或在开始时添加0的任何其他方式
答案 0 :(得分:2)
根据MSDN https://github.com/angular/angular/issues/4933的文档:
不建议您添加和减去值 SYSTEMTIME结构获取相对时间。相反,你应该
将 SYSTEMTIME 结构转换为 FILETIME 结构。
将生成的 FILETIME 结构复制到 ULARGE_INTEGER 结构。
在 ULARGE_INTEGER 值上使用普通的64位算术。
SYSTEMTIME
会让您了解如何开始使用。
答案 1 :(得分:1)
在我看来,最简单的解决方案是借用你需要的东西。
你已经有了整数。如果您从systemTime
中减去两个t2
值,t1
,请说明
if( t1.wMilliseconds < t2.wMilliseconds ) {
t1.wMilliseconds += 1000;
t1.wSeconds--;
}
或者,只需执行减法。如果结果wMlliseconds
为负数,请按上述方式进行调整。
但请注意确保t1 > t2
。你不想要-1.25 = 0.0 - 0.75
。
如果你想要一个浮点数,而不是用字符串做上瘾,那就做一个:
double time1 = t1.wSeconds + 0.001 * t1.wMilliseconds;
C为你做转换。它比通过字符串更快,更直接,更不容易出错。
答案 2 :(得分:0)
处理丢失的前导或尾随零(在时间和长时间内发现)的这些奇迹的另一种方法是用四个零填充字符串。即你的新MS +“0000”,并取最左边的四个字符。 然后,您有一个数字(作为文本),范围从“0000”到“9990”。 在它前面放一个“1”,然后你就可以轻松无误地转换为10000到19990之间的整数。 然后你可以随意添加和减去。
笨拙?确实是的:)但是当GPS经度读数从11.59(有趣的数字)变为12.00时,我不得不做这样奇怪的技巧