兩者的差別:
time_t是整型,存儲著至1970-1-1 00:00:00的時(shí)差(秒數(shù))(UTC時(shí)間)
DATA是浮點(diǎn)型,整數(shù)部分存儲著至1899-12-30 00:00:00的時(shí)差(天數(shù))(本地時(shí)間),小數(shù)部分存儲著時(shí)分秒。(BTW:DATA可以表示基點(diǎn)之前的時(shí)間,time_t不可以)
本算法只是想說明兩者之間轉(zhuǎn)化是很easy的,不需要MFC的支持,不需要“暈倒”,因此以下兩點(diǎn)不考慮:
a. 不考慮Local Time和UTC之間的時(shí)差(這玩意兒看起來就不爽,還是time_t好啊,一個(gè)time_t就夠了,DATE還得知道它用的時(shí)區(qū),否則有了數(shù)值也沒*用) ------- 既然有人問我怎么做,那我把這一點(diǎn)也考慮進(jìn)去吧
b. 不考慮錯(cuò)誤數(shù)值(比如 time_t(-1) 就是個(gè)錯(cuò)誤數(shù)值 ),不考慮轉(zhuǎn)化失敗的情況(因?yàn)閮烧叩谋硎痉秶灰粯樱?BR> #include
inline double timet_to_lotus( time_t t )
{
//return t/(24*60*60) + 25569 // t/(24*60*60)就只留下天數(shù)。time_t以1970/1/1為起點(diǎn),lotus以1899/12/30為基點(diǎn),差25569天
// + t%(24*60*60)/(60*60) / (24.0) // t%(24*60*60)就只留下時(shí)分秒,再/(60*60)就留下時(shí),除24就轉(zhuǎn)化為lotus時(shí)
// + t%(60*60)/(60) / (24.0*60.0) // t%(60*60)就只留下分秒,再/(60)就留下分,除24*60就轉(zhuǎn)化為lotus分
// + t%60 / (24.0*60.0*60.0); // t%(60)就只留下秒,除24*60*60就轉(zhuǎn)化為lotus秒
return (t+timezone)/(24.0*60.0*60.0) + 25569; // timezone是時(shí)區(qū)差
}
inline time_t lotus_to_timet( double dt )
{
return (time_t)( (dt-25569)*(24*60*60)-timezone + 0.5 ); // +0.5是什么原因大家肯定都知道。俺就奇怪了,這格式是哪個(gè)SN制定的,如果當(dāng)時(shí)沒有l(wèi)ong 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:%02dn", 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 之間的相互轉(zhuǎn)化(答[feveny]所問)
#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;
}
time_t是整型,存儲著至1970-1-1 00:00:00的時(shí)差(秒數(shù))(UTC時(shí)間)
DATA是浮點(diǎn)型,整數(shù)部分存儲著至1899-12-30 00:00:00的時(shí)差(天數(shù))(本地時(shí)間),小數(shù)部分存儲著時(shí)分秒。(BTW:DATA可以表示基點(diǎn)之前的時(shí)間,time_t不可以)
本算法只是想說明兩者之間轉(zhuǎn)化是很easy的,不需要MFC的支持,不需要“暈倒”,因此以下兩點(diǎn)不考慮:
a. 不考慮Local Time和UTC之間的時(shí)差(這玩意兒看起來就不爽,還是time_t好啊,一個(gè)time_t就夠了,DATE還得知道它用的時(shí)區(qū),否則有了數(shù)值也沒*用) ------- 既然有人問我怎么做,那我把這一點(diǎn)也考慮進(jìn)去吧
b. 不考慮錯(cuò)誤數(shù)值(比如 time_t(-1) 就是個(gè)錯(cuò)誤數(shù)值 ),不考慮轉(zhuǎn)化失敗的情況(因?yàn)閮烧叩谋硎痉秶灰粯樱?BR> #include
inline double timet_to_lotus( time_t t )
{
//return t/(24*60*60) + 25569 // t/(24*60*60)就只留下天數(shù)。time_t以1970/1/1為起點(diǎn),lotus以1899/12/30為基點(diǎn),差25569天
// + t%(24*60*60)/(60*60) / (24.0) // t%(24*60*60)就只留下時(shí)分秒,再/(60*60)就留下時(shí),除24就轉(zhuǎn)化為lotus時(shí)
// + t%(60*60)/(60) / (24.0*60.0) // t%(60*60)就只留下分秒,再/(60)就留下分,除24*60就轉(zhuǎn)化為lotus分
// + t%60 / (24.0*60.0*60.0); // t%(60)就只留下秒,除24*60*60就轉(zhuǎn)化為lotus秒
return (t+timezone)/(24.0*60.0*60.0) + 25569; // timezone是時(shí)區(qū)差
}
inline time_t lotus_to_timet( double dt )
{
return (time_t)( (dt-25569)*(24*60*60)-timezone + 0.5 ); // +0.5是什么原因大家肯定都知道。俺就奇怪了,這格式是哪個(gè)SN制定的,如果當(dāng)時(shí)沒有l(wèi)ong 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:%02dn", 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 之間的相互轉(zhuǎn)化(答[feveny]所問)
#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;
}