time(0)时间转换,以及时差带来的问题

http://hi.baidu.com/programpad/blog/item/ff52ab72709255168601b077.html

早上好友小思同学发来邮件,询问time(time_t *time)得到的时间如何转化为原有时间格式。现在我来回答一下,首先介绍一下这个函数。

#include <time.h>
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类得到当前日期、时间、星期,格式化

http://www.lvxuef.com/article.asp?id=290


也许你经常使用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




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值