在C语言中如何获取当前时间的毫秒数?

9

在C语言中,与Java的System.currentTimeMillis()等价的函数是什么?


1
请参考 https://dev59.com/K1XTa4cB1Zd3GeqPzTa8,那里有很好的答案。 - netcoder
1
可能是如何使用ANSI C测量毫秒时间?的重复问题。 - Ciro Santilli OurBigBook.com
5个回答

5
#include <sys/time.h>
/**
* @brief provide same output with the native function in java called
* currentTimeMillis().
*/
int64_t currentTimeMillis() {
  struct timeval time;
  gettimeofday(&time, NULL);
  int64_t s1 = (int64_t)(time.tv_sec) * 1000;
  int64_t s2 = (time.tv_usec / 1000);
  return s1 + s2;
}

我编写的这个函数类似于Java中的System.currentTimeMillis(),并且它们的输出相同。

3

请查看 time.h,可能会用到类似于 gettimeofday() 函数。

你可以这样做:

struct timeval now;
gettimeofday(&now, NULL);

您可以通过获取 now.tv_secnow.tv_usec 的值来提取时间。


now.tv_secnow.tv_usec分别代表什么单位? - Emil S.
秒和微秒。 - JohnyTex

3
在Linux和其他类Unix系统中,您应该使用clock_gettime(CLOCK_MONOTONIC)。如果不可用(例如Linux 2.4),则可以退回到gettimeofday()。后者的缺点是受时钟调整的影响。
在Windows上,您可以使用QueryPerformanceCounter()
我的这段代码将上述所有内容抽象为一个简单的接口,以int64_t的形式返回毫秒数。请注意,返回的毫秒值仅用于相对使用(例如超时),并且不相对于任何特定时间。

CLOCK_MONOTONIC并不完全等同于Java函数,因为Java函数也受到挂钟调整的影响。当然,对于间隔计时器来说,这是正确的选择,但如果OP想要挂钟时间,它将无济于事。 - bdonlan

0

有一个time()函数,但它返回的是秒而不是毫秒。如果你需要更高的精度,你可以使用特定于平台的函数,比如Windows的GetSystemTimeAsFileTime()或*nix的gettimeofday()

如果你实际上并不关心日期和时间,只是想计算两个事件之间的时间间隔,就像这样:

long time1 = System.currentTimeMillis();
// ... do something that takes a while ...
long time2 = System.currentTimeMillis();
long elapsedMS = time2 - time1;

如果要用C语言实现,可以使用clock()函数。在Windows系统中,更常用的是GetTickCount()函数。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接