我想获得系统时间,包括秒的小数部分。是否可以在标准c(ANSI C)中使用?如果没有,那么告诉我一些窗口操作系统的库,这样我就可以了。在Linux中,我有以下代码,对我来说工作正常。
#include <sys/time.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char buffer[30];
struct timeval tv;
time_t curtime;
gettimeofday(&tv, NULL);
curtime=tv.tv_sec;
strftime(buffer,30,"%m-%d-%Y %T.",localtime(&curtime));
printf("%s%ld\n",buffer,tv.tv_usec);
return 0;
}
输出是
12-25-2009 11:09:18.35443541
请帮助我,窗口操作系统怎么可能。如果ANSI C不允许我。
标准C不提供亚秒级分辨率时序。
POSIX确实提供了亚秒级的分辨率计时 - 事实上,有许多不同的方法,包括你展示的gettimeofday()
。
像这样:
#include <wtypes.h>
int main()
{
SYSTEMTIME t;
GetSystemTime(&t);
int year = t.wYear;
int month = t.wMonth;
int day = t.wDay;
int hour = t.wHour;
int minute = t.wMinute;
int second = t.wSecond;
int second_fraction = t.wMilliseconds;
return 0;
}
如果对您来说很重要,那么关于绩效的几点意见:
1)gettimeofday()
非常快,如果在几个线程中使用它不会导致性能恶化
2)在localtime()
内部有一个pthread_mutex_lock()
的调用(可能是因为它需要一些系统设置,如白天)。因此,当您在多线程应用程序中广泛使用它时,可能会出现性能问题
在上面的代码中
printf("%s%ld\n",buffer,tv.tv_usec);
大多数时候都会工作,但对于小的tv.tv_usec值来说这是不正确的。
如果tv.tv_usec是123,它将打印HH:MM:SS.123
时应该打印HH:MM:SS.000123
试试这个:
printf("%s%.6ld\n", buffer, tv.tv_usec);