Windows中的时间(SYSTEMTIME和FILETIME) (转载)

摘要:
然而,CRT中的tm时间对应于SDK中的系统时间,而CRT_ SDK中的时间t对应于文件时间。这个“特殊时刻”也变成了1601年1月1日的午夜。SYSTEMTIME与tm类似,增加了wMilliseconds。与在CRT_中提供tm和time类似,SDK还提供两个函数来将SYSTEMTIME时间转换为FILETIME时间。BOOL系统时间到文件时间;BOOLFileTime到系统时间;函数名非常不言自明,所以不用说。20行中的SystemTimeToFileTime函数将本地SYSTEMTIME时间转换为本地FILETIME时间,以便于计算,如输出结果的第三行所示。

转载:http://blog.csdn.net/bokee/article/details/5330791

两种时间系统之间没有本质区别(事实上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提供了更丰富的函数来处理时间。

voidGetSystemTime( 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>
intmain()
{
    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);
    returnEXIT_SUCCESS;
}

程序输出结果如下:

Windows中的时间(SYSTEMTIME和FILETIME) (转载)第1张

代码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时间。

2.文件修改时间

转载:https://www.xuebuyuan.com/541894.html

CString GetModifyTime(CString appname)
{
    WIN32_FIND_DATA ffd ;
    HANDLE hFind = FindFirstFile(appname,&ffd);
    SYSTEMTIME stUTC, stLocal;
    FileTimeToSystemTime(&(ffd.ftLastWriteTime), &stUTC);
    SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
    CString strTmp;
    strTmp.Format("%d-%d-%d,%d:%d", stLocal.wYear,stLocal.wMonth,stLocal.wDay,stLocal.wHour,stLocal.wMinute);
}

免责声明:文章转载自《Windows中的时间(SYSTEMTIME和FILETIME) (转载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇搭建Kubernetes集群时DNS无法解析问题的处理过程 k8sSpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

codeforces 765 F Souvenirs 线段树+set

问题的含义:多个查询的间隔中两个数字之差的绝对值的最小值:可以根据查询的l对脱机查询进行排序,并且可以从r到l进行反向查询,并且间隔i+1到n的每次更新都可以确保此更新不会影响下一次和后续更新。因为当两个区间相互覆盖时,具有较小l的区间的值必须小于或等于另一个区间,因此可以绘制一个图来理解。...

Dapper系列之一:Dapper的入门(多表批量插入)

Dapper只是一个完全开源的代码文件。您可以在项目中的任何位置实现数据到对象ORM操作,其大小小,速度快。Dapper的优点:1。Dapper是一个轻量级ORM类。该代码是一个SQLMapper.cs文件,编译后通常约为40k dll;2.Dapper,快点,你为什么说得快?因为Dapper的速度接近IDataReader,所以列表的数据比DataTabl...

SAP OBA1 外币评估是基于财务目的,为了不影响报表而做的估算值,在月末进行评估,在下月初进行冲回。

评估报告按行项目显示结果。4.评估策略外币的未清项评估有三种策略:1)期末评估,下期初冲回。因此目前每年底改变外币汇率时进行外币余额和未清项的评估,不冲回。②资产负债表指定日,一般是一年的最后一天。③资产负债表准备评估。如果选择该项,则视为年结评估,不能产生冲销凭证。外币未清项评估是按借贷分别统计后做的调整凭证。...

H3C系列之三层交换机系统版本升级

本文中涉及的硬件和软件交换机:H3CS3600-28TP-SItftp软件:tftpd32软件升级文件:S36SI_ E-CMW310-R1702P44.zip升级文件描述如下:S36SI_ E-CMW310-R1702P44-S168.bin168-bitSSH加密应用程序S3600_ V606.btmbootrom(downloadedynetworkp...

ES基本查询总结

ES与数据库比较查询操作Elasticsearch中当我们设置Mapping完毕后,就可以按照设定的方式导入数据。以下内容的原文需要参考ES官方文档1、结构化检索针对字段类型:日期、时间、数字类型,以及精确的文本匹配。结构化检索特点:*1)结构化查询,我们得到的结果总是非是即否,要么存于集合之中,要么存在集合之外。term查询是简单的,它接受一个字段名以及我...