2012年(158)
分类: C/C++
2012-11-23 16:44:30
time_t 和 DATE 之间的相互转化(答所问)
两者的差别:
time_t是整型,存储着至1970-1-1
00:00:00的时差(秒数)(UTC时间)
DATA是浮点型,整数部分存储着至1899-12-30
00:00:00的时差(天数)(本地时间),小数部分存储着时分秒。(BTW:DATA可以表示基点之前的时间,time_t不可以)
本算法只是想说明两者之间转化是很easy的,不需要MFC的支持,不需要“晕倒”,因此以下两点不考虑:
a.
不考虑Local
Time和UTC之间的时差(这玩意儿看起来就不爽,还是time_t好啊,一个time_t就够了,DATE还得知道它用的时区,否则有了数值也没屁用)
------- 既然有人问我怎么做,那我把这一点也考虑进去吧
b. 不考虑错误数值(比如 time_t(-1) 就是个错误数值
),不考虑转化失败的情况(因为两者的表示范围不一样)。
#include
inline double timet_to_lotus( time_t t )
{
//return
t/(24*60*60) + 25569 //
t/(24*60*60)就只留下天数。time_t以1970/1/1为起点,lotus以1899/12/30为基点,差25569天
//
+ t%(24*60*60)/(60*60) / (24.0) //
t%(24*60*60)就只留下时分秒,再/(60*60)就留下时,除24就转化为lotus时
// + t%(60*60)/(60) /
(24.0*60.0) // t%(60*60)就只留下分秒,再/(60)就留下分,除24*60就转化为lotus分
// +
t%60 / (24.0*60.0*60.0); // t%(60)就只留下秒,除24*60*60就转化为lotus秒
return (t+timezone)/(24.0*60.0*60.0) + 25569; //
timezone是时区差
}
inline time_t lotus_to_timet( double dt )
{
return
(time_t)( (dt-25569)*(24*60*60)-timezone + 0.5 ); //
+0.5是什么原因大家肯定都知道。俺就奇怪了,这格式是哪个SN制定的,如果当时没有long
long,那也宁可用struct,而不是double
}
// 以下为测试代码
#include
#include
#include
int main()
{
time_t a = time(0);
COleDateTime
b( timet_to_lotus(a) );
printf( "current UTC time is %04d-%02d-%02d
%02d:%02d:%02d\n", b.GetYear(), b.GetMonth(), b.GetDay(), b.GetHour(),
b.GetMinute(), b.GetSecond() );
time_t c = lotus_to_timet( b.m_dt );
assert( c == a
);
return 0;
}
//////////////////////////////////////////////////////////////////
time_t 和 SYSTEMTIME 之间的相互转化(答所问)
#include
#include
inline SYSTEMTIME timet_to_systime( time_t t )
{
tm
gm = *localtime( &t );
SYSTEMTIME st = { 1900+gm.tm_year, 1+gm.tm_mon, gm.tm_wday,
gm.tm_mday, gm.tm_hour, gm.tm_min, gm.tm_sec, 0 };
return
st;
}
inline time_t systime_to_timet( const SYSTEMTIME& st
)
{
struct tm gm = { st.wSecond, st.wMinute, st.wHour, st.wDay,
st.wMonth-1, st.wYear-1900, st.wDayOfWeek, 0, 0 };
return mktime( &gm );
}
// 以下为测试代码
#include
#include
int main()
{
time_t a = time(0);
SYSTEMTIME b
= timet_to_systime( a );
time_t c = systime_to_timet( b );
assert( a == c );
COleDateTime d( a );
COleDateTime e( b );
assert( d == e );
return 0;
}
网友评论2012-11-23 16:45:09
yqever
看到你的文章晚了点。我前几天看了看MFC的源码,这样写了一个。 SystemTimeToVariantTime好像是MS内部使用的一个未公开函数。
DATE AppNodesStatus::ConvertToDate(time_t t)
{
tm* ptm = localtime(&t);
SYSTEMTIME timeDest;
timeDest.wYear = (WORD) (1900 + ptm->tm_year);
timeDest.wMonth = (WORD) (1 + ptm->tm_mon);
timeDest.wDayOfWeek = (WORD) ptm->tm_wday;
tim