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( 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();