Windows下时间函数总结

来源:互联网 发布:2018年四川省大数据 编辑:程序博客网 时间:2024/06/05 00:43
Windows下时间函数总结

        通过阅读《windows核心编程》和左丞的博客《http://blog.csdn.net/morewindows/article/details/6854764》,现在总结下Windows下时间函数和使用方法。

一. Windows平台下常用的计时函数
        Windows平台下常用的计时函数,包括精度为秒、毫秒、微秒三种精度的5种方法。分为在标准C/C++下的二种time()及clock(),标准C/C++所以使用的time()及clock()不仅可以用在Windows系统,也可以用于Linux系统。在Windows系统下三种,使用Windows提供的API接口timeGetTime()、GetTickCount()及QueryPerformanceCounter()来完成。

标准C/C++的二个计时函数time()及clock()

time_t time(time_t *timer);

返回以格林尼治时间(GMT)为标准,从1970年1月1日00:00:00到现在的此时此刻所经过的秒数。

time_t实际是个long长整型typedef long time_t;

头文件:#include <time.h>

 

clock_t clock(void);

返回进程启动到调用函数时所经过的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock),以毫秒为单位。

clock_t实际是个long长整型typedef long clock_t;

头文件:#include <time.h>

 

Windows系统API函数

timeGetTime()、GetTickCount()及QueryPerformanceCounter()

 

DWORD timeGetTime(VOID);

返回系统时间,以毫秒为单位。系统时间是从系统启动到调用函数时所经过的毫秒数。注意,这个值是32位的,会在0到2^32之间循环,约49.71天。

头文件:#include <Mmsystem.h>            

引用库:#pragma comment(lib, "Winmm.lib")  

 

DWORD WINAPI GetTickCount(void);

这个函数和timeGetTime()一样也是返回系统时间,以毫秒为单位。

头文件:直接使用#include <windows.h>就可以了。

 

高精度计时,以微秒为单位(1毫秒=1000微秒)。

先看二个函数的定义

BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);

得到高精度计时器的值(如果存在这样的计时器)。

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

返回硬件支持的高精度计数器的频率(次每秒),返回0表示失败。

再看看LARGE_INTEGER

它其实是一个联合体,可以得到__int64 QuadPart;也可以分别得到低32位DWORD LowPart和高32位的值LONG HighPart。

在使用时,先使用QueryPerformanceFrequency()得到计数器的频率,再计算二次调用QueryPerformanceCounter()所得的计时器值之差,用差去除以频率就得到精确的计时了。

头文件:直接使用#include <windows.h>就可以了。

测试代码为:
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<Mmsystem.h>
#pragma comment(lib,"Winmm.lib")

int main()
{
  time_t timeBegin,timeEnd;
  timeBegin=time(NULL);
  Sleep(1000);
  timeEnd=time(NULL);
  printf("%d\n",timeEnd-timeBegin);


  clock_t clockBegin,clockEnd;
  clockBegin=clock();
  Sleep(800);
  clockEnd=clock();
  printf("%d\n",clockEnd-clockBegin);


  DWORD dwBegin,dwEnd;
  dwBegin=timeGetTime();
  Sleep(800);
  dwEnd=timeGetTime();
  printf("%d\n",dwEnd-dwBegin);


  DWORD dwGTCBegin,dwGTCEnd;
  dwGTCBegin=GetTickCount();
  Sleep(800);
  dwGTCEnd=GetTickCount();
  printf("%d\n",dwGTCEnd-dwGTCBegin);


  LARGE_INTEGER large_interger;
  double dff;
  __int64 c1,c2;
  QueryPerformanceFrequency(&large_interger);
  dff=large_interger.QuadPart;
  QueryPerformanceCounter(&large_interger);
  c1=large_interger.QuadPart;
  Sleep(800);
  QueryPerformanceCounter(&large_integer);
  c2=large_interger.QuadPart;
  printf("本机高精度计时器频率%lf\n",dff);
  printf("第一次计时器值%I64d  第一次计时器值%I64d  计时器差%I64d\n",c1,c2,c2-c1);
  printf("计时%lf毫秒\n",(c2-c1)*1000/dff);
  return 0;
}

二. Windows系统时间
Windows系统中表示时间的两个结构体——FILETIMESYSTEMTIME及相关函数。

先来看看这两个结构体的定义:

1.     FILETIME

//By MoreWindows-(http://blog.csdn.net/MoreWindows)

typedef struct _FILETIME {

    DWORDdwLowDateTime;

    DWORDdwHighDateTime;

FILETIME, *PFILETIME, *LPFILETIME;

它在MSDN上的说明——Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).

2.     SYSTEMTIME

//By MoreWindows-(http://blog.csdn.net/MoreWindows)

typedef struct _SYSTEMTIME {

    WORDwYear;

    WORDwMonth;

    WORDwDayOfWeek;

    WORDwDay;

    WORDwHour;

    WORDwMinute;

    WORDwSecond;

    WORDwMilliseconds;

SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;

这个就不用解释了,和大家平常表示时间的方法一样,都是日期(年--日)加时间(小时:分钟:秒)

 

与这两个结构体相关的函数主有6个——GetSystemTimeGetLocalTimeSystemTimeToFileTimeFileTimeToSystemTimeLocalFileTimeToFileTimeFileTimeToLocalFileTime。下面来看看这些函数的用法:

一.得到当前UTC时间

//By MoreWindows-(http://blog.csdn.net/MoreWindows)

void GetSystemTime(LPSYSTEMTIMElpSystemTime);

二.得到当地时间

void GetLocalTime(LPSYSTEMTIMElpSystemTime);

 

三.SYSTEMTIME转成FILETIME

//By MoreWindows-(http://blog.csdn.net/MoreWindows)

BOOLSystemTimeToFileTime(

    const SYSTEMTIME* lpSystemTime,

    LPFILETIMElpFileTime

);

四.FILETIME转成SYSTEMTIME

BOOLFileTimeToSystemTime(

    const FILETIME* lpFileTime,

    LPSYSTEMTIMElpSystemTime

);

 

五.当地时间转成UTC时间

//By MoreWindows-(http://blog.csdn.net/MoreWindows)

BOOLLocalFileTimeToFileTime(

    const FILETIME* lpLocalFileTime,

    LPFILETIMElpFileTime

);

六.UTC时间转成当地时间

BOOLFileTimeToLocalFileTime(

       const FILETIME* lpFileTime,

       LPFILETIMElpLocalFileTime

);

 

下面再给出一个示例,这个示例主要使用两个功能:

1.对获取当前当地系统时间

2.打开一个文件,并将文件的创建时间,修改时间,访问时间从FILETIME类型转成SYSTEMTIME类型。


测试代码如下:
#include<windows.h>
#include<stdio.h>
#include<conio.h>

class CWindowsDateAndTime
{
public:
static void GetCurrentLocalSystemTime(char *pstrDate,char *pstrTime);
    static void FileTimeToLocalSystemTime(FILETIME &ft,char *pstrData,char *pstrTime);
};

void CWindowsDateAndTime::GetCurrentLocalSystemTime(char *pstrData,char *pstrTime)
{
   SYSTEMTIME st;
   GetLocalTime(&st);
   if(pstrData!=NULL)
  sprintf(pstrData,"%d-%d-%d",st.wYear,st.wMonth,st.wDay);
   if(pstrTime!=NULL)
  sprintf(pstrTime,"%02d:%02d:%02d",st.wHour,st.wMinute,st.wSecond);
}


void CWindowsDateAndTime::FileTimeToLocalSystemTime(FILETIME &ft,char *pstrData,char *pstrTime)
{
   FILETIME localft;
   FileTimeToLocalFileTime(&ft,&localft);
   SYSTEMTIME st;
   FileTimeToSystemTime(&localft,&st);
   if(pstrData!=NULL)
  sprintf(pstrData,"%d-%d-%d",st.wYear,st.wMonth,st.wDay);
   if(pstrTime!=NULL)
  sprintf(pstrTime,"%02d:%02d:%02d",st.wHour,st.wMinute,st.wSecond);
}


int main(int argc,char *argv[])
{
  const int MAX_LEN=30;
  char strDate[MAX_LEN],strTime[MAX_LEN];
  CWindowsDateAndTime::GetCurrentLocalSystemTime(strDate,strTime);
  printf("当前系统时间: %s %s\n",strDate,strTime);
  const char *pstrFileName="D:\\MoreWindows.txt"; // 那个两个\是一种转义字符,其实就表示\。
  HANDLE handleFile=CreateFile(pstrFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
  FILETIME ftCreationTime,ftLastAccessTime,ftLastWriteTime;
  GetFileTime(handleFile,&ftCreationTime,&ftLastAccessTime,&ftLastWriteTime);
  CWindowsDateAndTime::FileTimeToLocalSystemTime(ftCreationTime,strDate,strTime);
  printf("创建时间: %s %s\n",strDate,strTime);
  CWindowsDateAndTime::FileTimeToLocalSystemTime(ftLastAccessTime,strDate,strTime);
  printf("访问时间: %s %s\n",strDate,strTime);
  CWindowsDateAndTime::FileTimeToLocalSystemTime(ftLastWriteTime,strDate,strTime);
  printf("修改时间: %s %s\n",strDate,strTime);
  getch();
  return 0;
}
原创粉丝点击