获取微妙毫秒级时间和时间戳

  1. 毫秒级:
QDateTime dateTime = QDateTime::currentDateTime();
QString strTime = dateTime.toString(“yyyy-MM-dd hh:mm:ss”);
qint64 timestamp= dateTime.toMSecsSinceEpoch();
QString strTimestamp = QString::number(timestamp); //13位时间戳
  1. 微秒级
QDateTime dateTime = QDateTime::currentDateTime();
QString strTime = dateTime.toString(“yyyy-MM-dd hh:mm:ss.zzz”);
struct timeval timestamp;
gettimeofday(&timestamp);
QString strTimestamp = QString::number(timestamp.tv_sec)+QString::number(timestamp.tv_usec);
qint64 uTimestamp = tstamp.toLong(); //16位时间戳

windows需要定义函数,linux只需添加头文件<sys/time.h>

#include <winsock.h>
#include <minwindef.h>
#include <sysinfoapi.h>
void gettimeofday(struct timeval *tv)
{
    if (tv != nullptr)
	{
		const unsigned __int64 delta_ = 11644473600000000Ui64;
		const double secOffSet = 0.000001;
		const unsigned long usecOffSet = 1000000;
		FILETIME fileTime;
		GetSystemTimeAsFileTime(&fileTime);
		unsigned __int64 present = 0;
		present |= fileTime.dwHighDateTime;
		present = present << 32;
		present |= fileTime.dwLowDateTime;
		present /= 10; // mic-sec
		// Subtract the difference
		present -= delta_;
		tv->tv_sec = static_cast<long>(present * secOffSet);
		tv->tv_usec = static_cast<long>(present % usecOffSet);
	}
}
<think>嗯,用户想要在C语言获取微秒精度的时间戳。我需要回想一下相关的系统调用函数。记得在Linux系统中,常用的函数是gettimeofday,不过现在可能已经被替换成更安全的版本了。另外,还有clock_gettime函数,可以提供更高精度的时间,比如纳秒级,但用户只需要微秒的话,可能需要转换一下。 首先,用户的问题明确提到需要微秒级别的精度,所以gettimeofday可能足够,因为它返回struct timeval,其中tv_usec就是微秒部分。不过要注意,gettimeofday已经被标记为过时,推荐使用clock_gettime。所以可能需要给出两种方法,并说明推荐使用后者。 然后,我需要检查引用的资料是否正确。引用[1][2]都提到了gettimeofdayclock_gettime,所以可以结合这些信息。用户提供的示例代码中,gettimeofday的使用是正确的,而clock_gettime需要链接-lrt库吗?或者在某些系统上是否需要?可能需要注意编译时的参数。 接下来,用户可能需要具体的代码示例。需要确保示例包括正确的头文件,比如sys/time.htime.h。struct timevalstruct timespec的定义分别位于这些头文件中。此外,clock_gettime的参数CLOCK_REALTIME是否正确?是的,它返回的是墙上时间,可能符合用户需求。 另外,关于时间戳的格式化,用户可能希望将秒微秒结合起来,比如转换成毫秒或者微秒的整数值。这时候需要注意溢出问题,比如将tv_sec转换为微秒需要乘以1e6,但如果是64位变量的话应该没问题。 还要考虑不同系统的兼容性。例如,gettimeofday在POSIX系统中可用,而clock_gettime可能需要检查是否支持。可能需要添加条件编译的宏,但用户可能只需要基本示例。 最后,需要提醒用户编译时可能需要链接特定的库,比如在旧版本的Linux中使用clock_gettime需要加上-lrt。而较新的glibc可能不需要。这点在回答中应该提到,避免用户编译时报错。 总结一下,回答应该包含两种方法:gettimeofdayclock_gettime,给出代码示例,并说明推荐使用clock_gettime的原因,比如更高精度未来兼容性。同时,注意事项部分包括编译参数数据类型转换。</think>### C语言微秒精度时间戳实现方法 在C语言获取微秒精度的时间戳,主要通过Linux系统的$gettimeofday()$$clock\_gettime()$系统调用实现。以下分步骤说明两种方法: --- #### **方法一:使用gettimeofday()函数** ```c #include <stdio.h> #include <sys/time.h> int main() { struct timeval tv; gettimeofday(&tv, NULL); // 第二个参数时区通常置为NULL long seconds = tv.tv_sec; // 秒级时间戳 long microseconds = tv.tv_usec; // 微秒部分(0-999,999) printf("时间戳:%ld秒 %ld微秒\n", seconds, microseconds); return 0; } ``` - **原理**:$gettimeofday()$将时间戳存储在$struct\ timeval$结构体中,包含$tv\_sec$(秒)$tv\_usec$(微秒)字段[^1]。 - **注意事项**:此函数已逐渐被$clock\_gettime()$取代,但仍广泛兼容。 --- #### **方法二:使用clock_gettime()函数(推荐)** ```c #include <stdio.h> #include <time.h> int main() { struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); // 使用系统实时时钟 long seconds = ts.tv_sec; // 秒级时间戳 long nanoseconds = ts.tv_nsec; // 纳秒部分(0-999,999,999) long microseconds = nanoseconds / 1000; // 转换为微秒 printf("时间戳:%ld秒 %ld微秒\n", seconds, microseconds); return 0; } ``` - **优势**:精度可达纳秒级别,通过$CLOCK\_REALTIME$参数获取系统实时时间[^2]。 - **编译参数**:需添加`-lrt`链接库(如:`gcc program.c -o program -lrt`)。 --- #### **应用场景对比** | 函数 | 精度 | 推荐场景 | |-----------------|------------|------------------------------| | `gettimeofday()`| 微秒级 | 快速获取时间,兼容旧系统 | | `clock_gettime()`| 纳秒级 | 高精度计时,现代系统首选 | --- #### **注意事项** 1. 若需要将时间戳合并为单一数值(例如总微秒数),可通过公式: $$总微秒数 = seconds \times 10^6 + microseconds$$ 2. 在32位系统中,$long$类型可能溢出,建议使用$uint64\_t$类型存储结果。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值