http://hi.baidu.com/programpad/blog/item/ff52ab72709255168601b077.html
早上好友小思同学发来邮件,询问time(time_t *time)得到的时间如何转化为原有时间格式。现在我来回答一下,首先介绍一下这个函数。
#include
time_t time( time_t *time );
这是C库函数,功能是用来获得1970年1月1日0时0分0秒到当前时间的秒数,如果参数为0则函数返回值即为结果,若参数不为0,则结果保存在参数中,下面以参数为0举例。
后来我问小思为什么不通过别的函数,如MFC函数或C#函数得到时间呢,她说,她从事的是底层开发,因为底层代码是没有MFC、C#的支持的,在底层获取的时间,想在上层表达出来,所以想要转换。
好吧,我来介绍一下如何转换。下面这段代码就是我写的时间转换函数,形参是通过time(0)得到的秒数。
CString CGetTimeSampleDlg::SwitchTime(int second)
{
CString yearstr,monthstr,daystr,hourstr,minutestr,secondstr,returnstr;
int daysp = second/(3600*24);
second = second%(3600*24);
int hoursp = second/3600;
second = second%3600;
int minutesp = second/60;
int secondsp = second%60;
CTimeSpan timesp(daysp,hoursp,minutesp,secondsp);
CTime basetime(1970,1,1,8,0,0);//此处要注意时差的问题
CTime nowtime;
nowtime = basetime+timesp;
int nowyear = nowtime.GetYear();
int nowmonth = nowtime.GetMonth();
int nowday = nowtime.GetDay();
int nowhour = nowtime.GetHour();
int nowminute = nowtime.GetMinute();
int nowsecond = nowtime.GetSecond();
yearstr.Format("%d",nowyear);
monthstr.Format("%d",nowmonth);
daystr.Format("%d",nowday);
hourstr.Format("%d",nowhour);
minutestr.Format("%d",nowminute);
secondstr.Format("%d",nowsecond);
returnstr = yearstr+"年"+monthstr+"月"+daystr+"日"+hourstr+"时"+minutestr+"分"+secondstr+"秒";
return returnstr;
}
这段代码使用了CTime类和CTimeSpan类。一个CTime对象代表一个绝对的时间和日期,而一个CTimeSpan对象代表一个相对的时间段。形象点说就是一个CTime类对象代表着一个准确的时间点,而一个CTimeSpan对象代表着一段时间。这里我要特别提醒一个问题就是时差所所带来的编码问题。
CTime basetime(1970,1,1,0,0,0);这个函数是按照格林威治标准时区来设计的,而我们所处的时区是GMT+8,所以,需要写成CTime basetime(1970,1,1,8,0,0);否则会出现运行时错误。
--------------------------------------------------------------------------------------------------------------
也许你经常使用VC++/C++开发环境,也许你经常使用CTime类,现整理CTime技巧若干,希望可以为广大网友带来方便。
① 定义一个CTime类对象 CTime time;
② 得到当前时间 time = CTime::GetCurrentTime();
③ GetYear( ),GetMonth( ), GetDay( ), GetHour( ), GetMinute( ), GetSecond( ), GetDayOfWeek( ) 返回整型(int)对应项目
④ 将当前时间格式化 CString date = time.Format("%Y-%m-%d %H:%M:%S %W-%A");
说明:
1) 结果为:2006-10-13 17:23:47 41-Friday
2) 格式符号说明
%a —— 星期(缩写英文),如Fri;
%A —— 星期(全写英文),如Friday
%b —— 月份(缩写英文),如Oct
%B —— 月份(全写英文),如 October
%c —— 月/日/年 时:分:秒,如 10/13/06 19:17:17
%d —— 日期(1 ~ 31)
%H —— 时(24小时制)(0 ~ 23)
%I —— 时(12小时制)(0 ~ 12)
%j —— 一年当中的第几天,(1 ~ 366)
%m —— 月份(数字 1 ~ 12)
%M —— 分(0 ~ 59)
%p —— 12小时中的A M/PM指示,或者AM,或者PM
%S —— 秒(0 ~ 59)
%U —— 一年中的第几周,星期日作为每周的第一天(0 ~ 53)
%w —— 星期(数字表示,0 ~ 6,0代表星期日)
%W —— 一年中的第几周,星期一作为每周的第一天(0 ~ 53)
%x —— 月/日/年,%c的前半段
%X —— 时/分/秒,%c的后半段
%y —— 年份(不带世纪,如 06)
%Y —— 年份(带世纪,如 2006)
%z,%Z —— 时区名称或缩写,如果时区未知,此字符为空,如“中国标准时间”
%% —— %
“#”标志的含义:
① %#a, %#A, %#b, %#B, %#p, %#X, %#z, %#Z, %#% ——“#” 被忽略
② %#c —— 把%c中的数字变成英文,再在前面加上星期, 如:“Tuesday, March 14, 1995, 12:41:29”.
③ %#x —— 把%x中的数字变成英文,再在前面加上星期,如:Tuesday, March 14, 1995
④ %#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U, %#w, %#W, %#y, %#Y —— 如果开 头为0,去掉开头的0