[转][VC/MFC]时间处理

 

MFC中相关类:   

    CTime
    CTimeSpan
    COleDateTime
    COleDateTimeSpan

API中相关时间处理函数:

    SystemTimeToFileTime
    FileTimeTo SystemTime
    FileTimeToLocal Time
    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(
6000);
tsWeekEnd.SetDateTimeSpan(
0000);
}

else
{
tsWeekBegin.SetDateTimeSpan(nXingQi
-2000);
tsWeekEnd.SetDateTimeSpan(
8-nXingQi, 000);
}

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();
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值