Windows编程之时间

查MSDN可以看到,windows中的时间分为以下几类:

Format

Type

Description

System

SYSTEMTIME

Year, month, day, hour, second, and millisecond, taken from the internal hardware clock.

Local

SYSTEMTIME orFILETIME

A system time or file time converted to the system's local time zone.

File

FILETIME

The number of 100-nanosecond intervals since January 1, 1601.

MS-DOS

WORD

A packed word for the date, another for the time.

Windows

DWORD orULONGLONG

The number of milliseconds since the system was last started. When retrieved as a DWORD value, Windows time cycles every 49.7 days.

Interrupt Count

ULONGLONG

The number of 100-nanosecond intervals since the system was last started.

 下面来看看SYSTEMTIME FILETIME这两个构造体。 

typedef struct _SYSTEMTIME {
  WORD wYear;		// [1601, 30827]
  WORD wMonth;		// [1, 12] = [January, December]
  WORD wDayOfWeek;	// [0, 6] = [Sunday, Monday, …, Saturday]
  WORD wDay;		// [1, 31]
  WORD wHour;		// [0, 23]
  WORD wMinute;		// [0, 59]
  WORD wSecond;		// [0, 59]
  WORD wMilliseconds;	// [0, 999]
} SYSTEMTIME, *PSYSTEMTIME;


这个结构体只是用来存放时间的,具体里面存什么时间,取决于时间是从哪个API获取的。 

涉及到这个结构体的API有:

API

作用

GetLocalTime      

取得SYSTEMTIME格式的本地时间。

GetSystemTime

取得SYSTEMTIME格式的UTC时间。

SetLocalTime

设定SYSTEMTIME格式的本地时间。

SetSystemTime

设定SYSTEMTIME格式的UTC时间。

typedef struct _FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime;
} FILETIME, *PFILETIME;


这个结构体说白了,就是用两个DWORD存了一个很大的数用来表示时间。
这个数是从1601年1月1日起到存放的时间为止,有多少个100纳秒间隔。

涉及到这个结构体的API有:

API

作用

CompareFileTime

比较两个FILETIME时间。

GetFileTime

检索一个文件或目录的创建,上次访问,和最后修改的日期和时间。

SetFileTime 

设定一个文件或目录的创建,上次访问,和最后修改的日期和时间。

FileTimeToLocalFileTime

将一个UTC的文件时间转换为本地的文件时间。

LocalFileTimeToFileTime

本地文件时间转换到UTC文件时间。

这里需要说明的是GetFileTimeSetFileTime 操作的是UTC时间。

 可以做个实验:

假如我在东八区,现在本地时间是11:40AM

1、GetSystemTime  得到3:40AM(UTC时间)

2、SystemTimeToFileTime  将3:40AM(UTC时间)转化为FILETIME

3、SetFileTime 将3:40AM(UTC时间)设定到文件属性。

4、用windows的资源管理器查看刚才设定的文件,时间是11:40AM

也就是说,文件属性中的存放的创建时间,上次访问时间,最后修改时间都是UTC时间,

只不过用windows的资源管理器查看时,该程序根据当前系统设定的时区,重新计算后显示了。

验证这一点也很简单,将系统时区改为东七区,查看刚才的文件,现在文件的时间变为10:40AM了。

 

了解了这一点,大家可以考虑下面的2个问题该怎么做呢?

问题1:如何将一个SYSTEMTIME格式的本地时间设定到一个文件的属性中?

答案:

1、SystemTimeToFileTime  将SYSTEMTIME格式的本地时间转化为FILETIME格式的本地时间

2、LocalFileTimeToFileTime 本地文件时间转换到UTC文件时间。

3、SetFileTime  设定文件时间。

 

问题2:如何像资源管理器那样,显示文件的本地时间。

答案:

1、GetFileTime    取得UTC格式的文件时间

2、FileTimeToLocalFileTime  将UTC格式的文件时间转化为本地文件时间

3、FileTimeToSystemTime  将本地文件时间转化为SYSTEMTIME格式的时间。

 

还有两个API是用来转化SYSTEMTIME FILETIME这两个构造体的。

API

作用

FileTimeToSystemTime

将一个FILETIME格式的时间转化为SYSTEMTIME格式的UTC时间。

SystemTimeToFileTime

将一个SYSTEMTIME格式的UTC时间转化为FILETIME格式的时间。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值