用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位的啊?
...全文
2095 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是分时操作系统,不可能完全精确的

wintree 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为毫秒级的,难道没有得到毫秒级的函数么
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。下面详细介绍一下! Select的函数格式(我所说的是Unix系统下的伯克利socket编程,和windows下的有区别,一会儿说明): int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); 先说明两个结构体: 第一,struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。fd_set集合可以通过一些宏由人为来操作,比如清空集合FD_ZERO(fd_set *),将一个给定的文件描述符加入集合之中FD_SET(int ,fd_set *),将一个给定的文件描述符从集合中删除FD_CLR(int ,fd_set*),检查集合中指定的文件描述符是否可以读写FD_ISSET(int ,fd_set* )。一会儿举例说明。 第二,struct timeval是一个大家常用的结构,用来代表时间值,有两个成员,一个是秒数,另一个是毫秒数。 具体解释select的参数: int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。 fd_set *readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。 fd_set *writefds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的写变化的,即我们关心是否可以向这些文件中写入数据了,如果这个集合中有一个文件可写,select就会返回一个大于0的值,表示有文件可写,如果没有可写的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的写变化。 fd_set *errorfds同上面两个参数的意图,用来监视文件错误异常。 struct timeval* timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态,第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;第三,timeout的值大于0,这就是等待的超时时间,即select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。 返回值: 负值:select错误 正值:某些文件可读写或出错 0:等待超时,没有可读写或错误的文件

64,685

社区成员

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

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