C语言 将int类型datetime转换为毫秒

mmvthczy  于 2023-05-28  发布在  其他
关注(0)|答案(3)|浏览(138)

int类型的datetime表示如下,13:32:53:600 => 133253600,我想将int类型的datetime转换为从当天0:00:00开始经过的毫秒数。例如,133253600 => 48773600

quhf5bfb

quhf5bfb1#

考虑 HHMMSSmmm 形式的数字,其中 HH 是十进制小时数,MM 是十进制分钟数,SS 是十进制秒数,mmm 是十进制毫秒数。

  • HH*0000000被解释为毫秒的十进制数,比 HH 小时的毫秒数多。一小时有3,600,000毫秒,所以3,600,000·HHHH 小时里,但是 HH0000000代表10,000,000·HH 毫秒。它多了6,400,000·HH 毫秒。因此,我们可以通过减去6,400,000·HH 来校正它。

类似地,MM00000表示100,000·MM 毫秒,但在 MM 分钟中只有60,000·MM 毫秒。它多了40,000·MM 毫秒,所以我们可以通过减去40,000·MM 来纠正它。

  • SSmmm* 表示 SS 秒和 mmm 毫秒中的毫秒数,因此不需要对它们进行校正。

我们可以通过使用C的截断除法将 HHMMSSmmm 除以10,000,000来容易地找到 HH。分离会议记录需要更多的工作。除以100,000将给予 HHMM,然后我们需要取余数来分离 MM。然而,相反,我们可以重写校正以直接使用 HHMM
给定某个 xHHMMSSmmm,我们需要 xHH·6,400,000 − MM·40,000。加减 HH00·40,000不会改变数字,因此:

  • xHH·6,400,000 − MM·40,000
  • = xHH·6,400,000 − MM·40,000 + HH00·40,000 − HH00·40,000
  • = xHH·6,400,000 + HH·100·40,000 − MM·40,000 − HH00·40,000
  • = xHH·(6,400,000 − 4,000,000)− * HHMM*·40,000。
  • = xHH·2,400,000 − HHMM·40,000。

如上所述,HH 可以在C中计算为x/10000000HHMM 可以计算为x/100000
因此,给出我们所需结果的表达式是x - x/10000000*2400000 - x/100000*40000,它使用四个乘法/除法运算和两个加法/减法运算。

6yoyoihd

6yoyoihd2#

你必须除以10000000(只保留整数)才能得到小时(前2个数字),100000得到前4个,1000得到前6个,等等。有了这些数字,你就可以用模数100来得到这个数字的最后2位,用模数1000来保留最后3位。你要做的最后一件事就是把它们转换成毫秒,就是这样。

int time=133253600 //example
    int hours = time/ 10000000;
    int minutes = (time/ 100000) % 100;
    int seconds = (time/ 1000) % 100;
    int milliseconds = time% 1000;

    int timeInMs = (hours * 3600000) + (minutes * 60000) + (seconds * 1000) + milliseconds;

它不使用8个操作,但我无法想象你怎么能在更少的操作上做到这一点。你可以通过除以更小的数字来优化,如果你做一个操作取决于前一个,也许。

41zrol4v

41zrol4v3#

结果计算如下:

r = ( ( ( H * 60 ) + M ) * 60 ) + S ) * 1000 + milli;

所以如果我们包括获取组件,那就是

t = 133253600;

H = t / 10000000;
M = t / 100000 % 100;
S = t / 1000 % 100;
milli = t % 1000;

r = ( ( ( H * 60 ) + M ) * 60 ) + S ) * 1000 + milli;

但是秒数在技术上已经是正确的了。

t = 133253600;

H = t / 10000000;
M = t / 100000 % 100;
milli = t % 100000;

r = ( ( H * 60 ) + M ) * 60 + milli;

这是所需的8个操作。4个除法,2个乘法和2个加法。

相关问题