程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> time_t和DATE之間的相互轉化

time_t和DATE之間的相互轉化

編輯:關於C++

兩者的差別:

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 <ctime>

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 <ATLComTime.h>
#include <ctime>
#include <cassert>

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 之間的相互轉化(答[feveny]所問)

#include <ctime>
#include <windows.h>

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 <ATLComTime.h>
#include <cassert>

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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved