上一篇中介绍了C运行库中的时间处理函数。这一篇介绍Windows SDk中提供的时间函数。两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC实现),同样提供本地时间和UTC时间之间的转换。不过CRT中的tm时间在SDK中对应为系统时间(SYSTEMTIME),CRT中的time_t时间在SDK中对应的为文件时间(FILETIME),那个"特殊时刻"也变成1601年1月1日的子夜。
当然,首先要弄清楚FILETIME与SYSTEMTIME定义。
- typedef struct _FILETIME {
-
DWORD dwLowDateTime;
-
DWORD dwHighDateTime;
- } FILETIME, *PFILETIME;
-
typedef struct _SYSTEMTIME {
-
WORD wYear;
-
WORD wMonth;
-
WORD wDayOfWeek;
-
WORD wDay;
-
WORD wHour;
-
WORD wMinute;
-
WORD wSecond;
-
WORD wMilliseconds;
- } SYSTEMTIME, *PSYSTEMTIME;
比较一下,很明显,FILETIME与time_t类似,是64位整型,不过FILETIME是以100纳秒(ns)为单位。SYSTEMTIME与tm类似,不过多了一项wMilliseconds。可以看出,SDK时间比CRT的时间提供了更高的精度。同时SDK提供了更丰富的函数来处理时间。
- void GetSystemTime(
- LPSYSTEMTIME lpSystemTime);
-
void GetLocalTime(
- LPSYSTEMTIME lpSystemTime);
这两个函数获得SYSTEMTIME形式的当前时间,不过GetSystemTime函数获得当前的UTC时间,GetLocalTime获得当前的本地时间,可以想象,获得的两个时间存在着时差。类似于CRT中提供tm与time_t之间的转换,SDK也提供了两个函数来转换SYSTEMTIME时间与FILETIME时间。
- BOOL SystemTimeToFileTime(
-
const SYSTEMTIME* lpSystemTime,
- LPFILETIME lpFileTime);
-
BOOL FileTimeToSystemTime(
-
const FILETIME* lpFileTime,
- LPSYSTEMTIME lpSystemTime);
函数命名很self-explanatory,就不用多说了吧。
SDK还提供了两个很有趣的函数。
- BOOL LocalFileTimeToFileTime(
-
const FILETIME* lpLocalFileTime,
- LPFILETIME lpFileTime);
-
BOOL FileTimeToLocalFileTime(
-
const FILETIME* lpFileTime,
- LPFILETIME lpLocalFileTime);
LocalFileTimeToFileTime函数将本地的FILETIME时间转换为对应的UTC的FILETIME时间。我觉得,这个函数只是通过将本地时间减去与UTC时间的时间差来实现转换,比如在东八区的本地时间转换为对应的UTC时间,只需要将本地时间减去8*60*60*1000*1000*10(单位100ns)。类似,FileTimeToLocalFileTime函数是将UTC时间转换为本地时间,它只是将减去时间差换成加上时间差。
了解了这些功能,让我们用代码说话吧。
- #include <stdlib.h>
- #include <stdio.h>
- #include <time.h>
- #include <windows.h>
-
int main()
- {
- SYSTEMTIME stLocal, stUTC, stUTC2;
- FILETIME ftLocal, ftUTC, ft;
- ULARGE_INTEGER uli;
-
- GetLocalTime(&stLocal);
- GetSystemTime(&stUTC);
-
printf("Local System Time(YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stLocal.wYear, stLocal.wMonth,
- stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
-
printf("UTC System Time (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC.wYear, stUTC.wMonth,
- stUTC.wDay, stUTC.wHour, stUTC.wMinute, stUTC.wSecond);
-
- SystemTimeToFileTime(&stLocal, &ftLocal);
- uli.LowPart = ftLocal.dwLowDateTime;
- uli.HighPart = ftLocal.dwHighDateTime;
-
printf("Local File Time: %llu/n", uli.QuadPart);
-
- LocalFileTimeToFileTime(&ftLocal, &ftUTC);
- uli.LowPart = ftUTC.dwLowDateTime;
- uli.HighPart = ftUTC.dwHighDateTime;
-
printf("UTC File Time: %llu/n", uli.QuadPart);
-
- FileTimeToSystemTime(&ftUTC, &stUTC2);
-
printf("UTC System Time2 (YYYY-MM-DD HH:MM:SS): %d-%d-%d %d:%d:%d/n", stUTC2.wYear, stUTC2.wMonth,
- stUTC2.wDay, stUTC2.wHour, stUTC2.wMinute, stUTC2.wSecond);
-
-
return EXIT_SUCCESS;
- }
程序输出结果如下:
代码13行GetLocalTime函数获得当前的本地SYSTEMTIME时间,14行获得对应的UTC的SYSTEMTIME时间,如输出结果前两行所显示,两者相差8小时(凌晨还在写博客,表扬下自己。。。)。
20行SystemTimeToFileTime函数将本地SYSTEMTIME时间转换为方便计算的本地FILETIME形式时间,如输出结果第三行所显示。
25行LocalFileTimeToFileTime函数将本地FileTime时间转换为对应的UTC的FILETIME时间,如输出结果第四行所显示。就像前面介绍的,如果你将输出结果第三,四两行所显示的数字相减,并除以10*1000*1000*60*60,你将会得出8,你可以算下试试,记住FILETIME是以100纳秒为单位的。
最后30行FileTimeToSystemTime将FILETIME时间转换为SYSTEMTIME时间。可以看出输出结果中第五行与第二行相同,这是必须的,因为两者都是当前本地时间对应的UTC时间。
分享到:
相关推荐
各种时间的转换 systemtime转time_t,FILETIME 转 time_t等
C# 调用windows的shell32 获取icon 调用winAPI转换SYSTEMTIME到FILETIME
方法一 利用 SYSTEMTIME 方法二 利用 GetTickCount()函数 方法三 使用clock()函数 方法四 获取高精度时间差
该模块适合初学者,演示了定时器的操作、SYSTEMTIME转换为字符串的操作等基本方法,还演示了多线程的启动和停止。 实现的功能为:自动设置时间跳变,可以选择跳变分钟,跳变小时和跳变日期。
如何在VC++中获取系统时间以及获得程序运行时间
总结了常用的四种方法。包括: 方法一 利用 SYSTEMTIME 方法二 利用 GetTickCount()函数 方法三 使用clock()函数 方法四 获取高精度时间差 个人感觉还是很清晰明了的。希望对大家有用。
C++使用SYSTEMTIME时间点减去天数求时间点,解决2038年问题。
简单的函数,获取pc机上的时间和utc时间
在windows编程中,经常会用到各种各样的时间类型:FILETIME SYSTEMTIME tm time_t,于是就把他们总结出来
此程序是一个显示系统时间的小程序,可显示出年月日时分秒~
用visual c++ 编程来改变window系统的时间
用汇编显示系统当前时间,显示时、分、秒.
改变系统时间的实现
项目中的一个小功能,与大家分享下 1、显示本地电脑时间 2、显示北京标准时间(获取的百度时间) 3、同步时间 代码可直接运行,开发环境VS2012,net4.0,其实主要是代码块就可以 调用的函数如下 [DllImport(...
SetLocalTime需要一个SYSTEMTIME结构指针作为参数,这倒不难,我们可以“比葫芦画瓢”很快在C#中定义这个结构,但问题是,我同时还想“享受”.NET Framework的System.DateTime在时间转换和处理方面的便利,怎么办?...
调试环境c++ Builder6或者c++ Builder 2010,目录下ProjectBCB6.bpr是c++ ...程序是通过API函数获得、设置系统本地时间的功能,并且实现了从一个DateTimePicker 控件获得日期和时间功能。程序短小,简练,可读性强。
一个c++写的读取系统时间的源代码,希望帮助初学者
本文实例讲述了C++设置系统时间及系统时间网络更新的方法。... //将基准时间转换成windows文件时间 st.wYear = 1900; st.wMonth = 1; st.wDay = 1; st.wHour = 0; st.wMinute = 0; st.wSecond
总结了常用的四种方法。包括: 方法一 利用 SYSTEMTIME 方法二 利用 GetTickCount()函数 方法三 使用clock()函数 方法四 获取高精度时间差 个人感觉还是很清晰明了的。希望对大家有用。
使用C++获取当前系统时间,并自动实时更新