vc时间函数总结

本文总结了VC++中处理时间的函数,包括使用C标准库的time_t和time(),以及struct tm与localtime()。还介绍了strftime()函数的各种时间格式化选项,并提到了GetLocalTime()与SetLocalTime()的区别。另外,文章提到了ATL中的CTime类和如何将CString转换为CTime。同时,讨论了通过sscanf进行字符串到时间值的转换,以及使用CTimeSpan计算时间差。

字符串和时间格式相互转化
一使用C标准库
在vc2010中time_t使用64位来保存时间类型
typedef __time64_t time_t;
使用函数time(time_t)time_t为NULL时获取日历时间,不为空设置日历时间
struct tm * localtime(const time_t * timer)返回一个以tm结构表达的时间

struct tm{
    int tm_sec;
    int tm_min;
    int tm_hour; 
    int tm_mday;
    int tm_mon;
    int tm_year;
    int tm_wday;
    int tm_yday;
    int tm_isdst}; 

size_t strftime(char * strDest,
size_t maxsize,
const char * format,
const struct tm * timeptr)
format:表达式字符串
%a 星期几的简写
%A 星期几的全称
%b 月份的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年份,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日作为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号

time_t t = time(0);
char tmp[64]; 
strftime( tmp, sizeof(tmp), " %Y/%m/%d %X %A 本年第%j天%z" , localtime(&t) );

使用WinApi
#include <windows.h>

typedef struct
{
    WORD wYear ;// 年
    WORD wMonth ;//月
    WORD wDayOfWeek ;//星期,0=星期日,1=星期一...
    WORD wDay ;//日
    WORD wHour ;//时
    WORD wMinute ;//分
    WORD wSecond ;//秒
    WORD wMilliseconds ;//毫秒
}SYSTEMTIME

函数GetLocalTime获得本地时间
void GetLocalTime(LPSYSTEMTIME lpSystemTime)
lpSystemTime是SYSTEMTIME结构体指针
BOOL SetLocalTime(const LPSYSTEMTIME lpSystemTime)
设置本地时间
GetLocalTime与GetSystemTime的区别在于localtime是带有时区的时间而systemtime是格林威治时间。


关于两个头文件#include <time.h> 是C标准库的头文件
而#include <ctime>是C++的头文件并包含了std的命名空间


ATL中有CTime类
其中有静态函数CTime::GetCurrentTime()

CTime(
    int nYear,//1970-3000
    int nMonth,//1-12
    int nDay,//1-31
    int nHour,//0-23
    int nMin,//0-59
    int nSec,//0-59
    int nDST = -1
);
参数nDST指定是否使用夏令时,0为表示实行标准时间,为正数使用夏令时,为负数系统自己计算,我国现在不使用夏令时,如俄罗斯使用夏令时。
CTime格式化时间使用函数CString Format(LPCTSTR pszFormat) const,格式化参数如下:
%a:周的英文缩写形式。
%A:周的英文全名形式。
%b: 月的英文缩写形式。
%B:月的英文全名形式。
%c: 完整的日期和时间。
%d:十进制形式的日期(01-31)。
%H:24小时制的小时(00-23)。
%I: 12小时制的小时(00-11)。
%j: 十进制表示的一年中的第几天(001-366)。
%m: 月的十进制表示(01-12)。
%M:十进制表示的分钟(00-59)。
%p: 12小时制的上下午标示(AM/PM)。
%S: 十进制表示的秒(00-59)。
%U: 一年中的第几个星期(00-51),星期日是一周的第一天。
%W: 一年中的第几个星期(00-51),星期一是一周的第一天。
%w: 十进制表示的星期几(0-6)。
%Y: 十进制表示的年。


CString转为CTime


需要库函数sscanf所需头文件#include <stdio.h>
int sscanf( const char *, const char *, ...);
使用sscanf把字符串转化为年月日时分秒的整形值并重新构造CTime
如果取时间差在vc中可使用CTimeSpan类
具体代码如:

CTime time1 = CTime::GetCurrentTime();
CTime time2 = CTime::GetCurrentTime(); // 两个CTime相减得到CTimeSpan 
CTimeSpan timeSpan = time2 - time1;



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值