您的位置:首页 > 其它

[VC/MFC]时间处理

2011-04-25 13:16 190 查看

MFC中相关类:   

    CTime 
    CTimeSpan
    COleDateTime
    COleDateTimeSpan

API中相关时间处理函数:

    SystemTimeToFileTime
    FileTimeToSystemTime
    FileTimeToLocalTime
    SetLocalTime
具体请参阅msdn:Time Functions http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/time_functions.asp

这里再复习一下中学的地理。。@-@

UTC 是协调世界时(Universal Time Coordinated)英文缩写,是由国际无线电咨询委员会规定和推荐,并由国际时间局(BIH)负责保持的以秒为基础的时间标度。UTC相当于本初子 午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示.北京时间比UTC时间早8小时,以1999年1月1日0000UTC为例, UTC时间是零点,北京时间为1999年1月1日早上8点整。 

GMT(Greenwich Mean Time)是格林尼治平均时: 
由于地球轨道并非圆形,其运行速度又随着地球与太阳的距离改变而出现变化,因此视太阳时欠缺均匀性。视太阳日的长度同时亦受到地球自转轴相对轨道 面的倾斜度所影响。为着要纠正上述的不均匀性,天文学家计算地球非圆形轨迹与极轴倾斜对视太阳时的效应。平太阳时就是指经修订后的视太阳时。在格林尼治子 午线上的平太阳时称为世界时(UT0),又叫格林尼治平时(GMT)。 

为了确保协调世界时与世界时(UT1)相差不会超过0.9秒,有需要时便会在协调世界时内加上正或负闰秒。因此协调世界时与国际原子时(TAI)之间会出现若干整数秒的差别。位于巴黎的国际地球自转事务中央局(IERS)负责决定何时加入闰秒。

时间单位转换

1s(秒:Second) = 1000 ms(毫秒:millisecond)
                       = 1000000 μs(微秒:microsecond)
                       = 1000000000 ns(纳秒:nanosecond)
                       = 1000000000000 ps(皮秒)
                       = 1000000000000000 fs(飞秒)

1.得到当前时间

这里需要注意的是,GetLocalTime得到的是本地时区的时间,而GetSystemTime是得到UTC时间。

COleDateTime odt = COleDateTime::GetCurrentTime();
String str = odt.Format("%Y-%m-%d %H:%M:%S");
COleDateTime::Format 的使用,请参阅msdn关于CTR库中strftime, wcsftime的解释 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_strftime.2c_.wcsftime.asp

2.在指定时间的基础上,加上或者减去一段时间后,得到新的日期时间


//MFC:


    COleDateTime odt = COleDateTime::GetCurrentTime();//得到当前时间


    COleDateTimeSpan odts;


    odts.SetDateTimeSpan(0, 15, 0, 0);//15个小时的时间差


    odt += odts;


    CString str = odt.Format("%Y-%m-%d %H:%M:%S");




//SDK:


//FILETIME是以100纳秒作为单位


//以下宏定义了1小时内有多少个该单位


#define Nano100_SEC_IN_HOUR (ULONGLONG)60*60*10000000




SYSTEMTIME st;


GetLocalTime(&st);


FILETIME ft={0};


SystemTimeToFileTime(&st, &ft);


ULARGE_INTEGER ui;


ui.LowPart = ft.dwLowDateTime;


ui.HighPart = ft.dwHighDateTime;


ui.QuadPart += 16 * Nano100_SEC_IN_HOUR;//当前时间加上16个小时后的时间


ft.dwLowDateTime = ui.LowPart;


ft.dwHighDateTime = ui.HighPart;


FileTimeToSystemTime(&ft, &st);


//st结构体中的变量即最后结果

3.根据给定的日期,得到该日期的星期数,再得到该星期开始和结束的日期

这个功能是当时帮一个mm的忙完成的。。呵呵


COleDateTime t1, tWeekBegin, tWeekEnd;


t1.SetDate(2006,8,8);


//这里需要注意的是西方人的习惯和我们不一样,他们把星期天当作每个星期的第一天,如下面的函数GetDayOfWeek就是如此,所以我做了下面的一些转换


int nXingQi = t1.GetDayOfWeek();


COleDateTimeSpan tsWeekBegin, tsWeekEnd;


if ( 1 == nXingQi )


{


tsWeekBegin.SetDateTimeSpan(6, 0, 0, 0);


tsWeekEnd.SetDateTimeSpan(0, 0, 0, 0);


}


else


{


tsWeekBegin.SetDateTimeSpan(nXingQi-2, 0, 0, 0);


tsWeekEnd.SetDateTimeSpan(8-nXingQi, 0, 0, 0);


}


tWeekBegin = t1 - tsWeekBegin;


tWeekEnd = t1 + tsWeekEnd;


CString str1 = tWeekBegin.Format("%Y-%m-%d");


CString str2 = tWeekEnd.Format("%Y-%m-%d"); 

 

4. CString -> COleDateTime


    CString str = "2006-09-04 11:22:33";


    COleVariant VariantTime;


    VariantTime = str;


    VariantTime.ChangeType(VT_DATE);


    COleDateTime DataTime = VariantTime;


    int nYear = DataTime.GetYear();


    int nMonth = DataTime.GetMonth();


    int nDay = DataTime.GetDay();


    int nHour = DataTime.GetHour();


    int nMin = DataTime.GetMinute();


    int nSec = DataTime.GetSecond();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc string date 咨询 c