用struct timeval获得毫秒级的时间

卡诺球 2011-12-15 05:54:33

#include <stdio.h>
#include <sys/time.h>

int main(int argc, char *argv[]) {
struct timeval tv;
if (gettimeofday(&tv, NULL) == 0)
{
time_t s = tv.tv_sec *1000;
time_t c = tv.tv_usec / 1000;
time_t time = s + c;
time_t time = s + c;
printf("%u:%u\n", tv.tv_sec, tv.tv_usec);
printf("%u:%u\n%u\n",s,c,time);
}
return 0;
}

运行结果:

1323942236:902777
1092308832:902
1092309734

struct timeval的两个属性分别是秒级和微秒级,都是long类型
因为我想把时间传给java,而java的Date就是毫秒级的
所以我想获取毫秒级的时间,理论上来说把秒级的sec*1000+微秒级的usec/1000
但是现在的问题在于这个tv_sec貌似永远都是10位长度,乘什么都是10位
是不是这个类型就是这样的啊?
我用long int 转存后再乘还是一样的。
怎么搞才能变成13位的啊?
...全文
2352 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
鲲尘千古 2011-12-17
  • 打赏
  • 举报
回复
你这里面的是需要强制转换的吧?
鲲尘千古 2011-12-17
  • 打赏
  • 举报
回复
你这里面的是需要强制转换的吧?
卡诺球 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kongrenxin 的回复:]

修改如下:
C/C++ code
#include <stdio.h>
#include <sys/time.h>

int main(int argc, char *argv[]) {
struct timeval tv;
if (gettimeofday(&tv, NULL) == 0)
{
long long s = tv.tv_sec;……
[/Quote]

我发现貌似long也不行,于是我换成了int64_t,这样总算可以了

int64_t s = (int64_t) tv.tv_sec * 1000;
int64_t c = tv.tv_usec / 1000;
int64_t time = s + c;
printf("%u:%u\n", tv.tv_sec, tv.tv_usec);
printf("%llu\n",time);
cout << time;


还有跟打印格式也有关系,
问下 printf("%llu\n",time); 中%llu是什么意思?
以及 long long s 为什么要写两个long啊?
kongrenxin 2011-12-15
  • 打赏
  • 举报
回复
修改如下:
#include <stdio.h>
#include <sys/time.h>

int main(int argc, char *argv[]) {
struct timeval tv;
if (gettimeofday(&tv, NULL) == 0)
{
long long s = tv.tv_sec;
s *= 1000;
time_t c = tv.tv_usec / 1000;
time_t time = s + c;
printf("%u:%u\n", tv.tv_sec, tv.tv_usec);
printf("%llu:%u\n%u\n",s,c,time);
}
return 0;
}

原因:time_t的宽度只有4字节, tv.tv_sec *1000数值已经溢出,所以达不到目的。
而且long long s = tv.tv_sec * 1000;这样写也不行,右边的表达式也是按照32位方式计算的,所以必须要将其拆分开来计算,就能达到long long 8字节的效果了。
柯本 2011-12-15
  • 打赏
  • 举报
回复
参考下我以前回过的:
http://topic.csdn.net/t/20040323/15/2875958.html
不过,windows是分时操作系统,不可能完全精确的

ctreewang 2011-12-15
  • 打赏
  • 举报
回复
printf("%10u:%3u\n", tv.tv_sec, tv.tv_usec);
gw_net 2011-12-15
  • 打赏
  • 举报
回复
GetCurrentTime
Gloveing 2011-12-15
  • 打赏
  • 举报
回复
printf("%10u:%3u\n", tv.tv_sec, tv.tv_usec);
卡诺球 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq120848369 的回复:]

啥叫变成13位的。。。

gettimeofday返回的就是1970年来的秒数。
[/Quote]
看运行结果
1323949020 : 902777
前面这个是秒数,一共10位。
但java给我的长整型是 1323949020619,一共13位
我指的是这个位数,不是byte位
qq120848369 2011-12-15
  • 打赏
  • 举报
回复
啥叫变成13位的。。。

gettimeofday返回的就是1970年来的秒数。
卡诺球 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 w170532934 的回复:]

java有date为毫秒级的,难道没有得到毫秒级的函数么
[/Quote]
我对java不太熟, 而且人家java端是服务器,程序都已经写好的,不可能因为我搞不出来而改变的。
W170532934 2011-12-15
  • 打赏
  • 举报
回复
java有date为毫秒级的,难道没有得到毫秒级的函数么

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧