C/C++ローカル時間取得の一般的な方法

6820 ワード

クロスプラットフォームメソッド
方法1:手動暴力法
#include <iostream>
using namespace std;
#include <time.h>

time_t t = time(NULL);
    struct tm* stime=localtime(&t);
char tmp[32]={NULL};
     sprintf(tmp, "%04d-%02d-%02d %02d:%02d:%02d",1900+stime->tm_year,1+stime->tm_mon,
                stime->tm_mday, stime->tm_hour,
                stime->tm_min,stime->tm_sec);
    cout<<tmp<<endl;

出力結果:2015-04-02 23:12:56
方法2:投機の巧みな方法
#include <iostream>
using namespace std;
#include <time.h>

    time_t t = time(0); 
    char tmp[32]={NULL};
    strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S",localtime(&t)); 
    cout<<tmp<<endl;

出力結果:2015-04-02 23:12:56
方法3:カレンダー時間法の簡略化
#include <iostream>
using namespace std;
#include <time.h>
#include <string>

time_t tm;
time(&tm);
char tmp[128]={NULL};
strcpy(tmp,ctime(&tm));
//  
//struct tm* stime=localtime(&tm);
//strcpy(tmp,asctime(stime));
cout<<tmp<<endl;

出力結果:Fri Aug 14 23:19:42 2015
Windowsプラットフォーム取得時間
#include <iostream>
using namespace std;
#include <time.h>
#include <windows.h>

SYSTEMTIME sys; 
GetLocalTime( &sys );
char tmp[64]={NULL};
sprintf(tmp,"%4d-%02d-%02d %02d:%02d:%02d ms:%03d",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds); 
    cout<<tmp<<endl;

出力結果:2015-08-14 23:41:56 ms:354
Unixプラットフォーム取得時間
#include <sys/time.h> 
#include <unistd.h>

struct timeval now_time;
gettimeofday(&now_time, NULL);
time_t tt = now_time.tv_sec;
tm *temp = localtime(&tt);
char time_str[32]={NULL};
sprintf(time_str,"%04d-%02d-%02d%02d:%02d:%02d",temp->tm_year+ 1900,temp->tm_mon+1,temp->tm_mday,temp->tm_hour,temp->tm_min, temp->tm_sec);
cout<<tmp<<endl;

出力時間:2015-08-14 23:41:56
必要な知識点
(1)UTC(Coordinated Universal Time):世界を調和させる場合、世界標準時間とも呼ばれる.グリニッジ平均時間(Greenwich Mean Time,GMT)によって提供されていたが、現在は原子時計によって提供されている.例えば、中国大陸部の時間とUTCの時差は+8、すなわちUTC+8である.アメリカはUTC-5です.
(2)Calendar Time:カレンダ時間は、「1つの標準時点からその時点までの時間が経過した秒数」で表される時間であり、time()関数により取得される.この標準時点はコンパイラによって異なりますが、1つのコンパイルシステムにとって、この標準時点は変わらず、このコンパイルシステムにおける時間に対応するカレンダー時間はこの標準時点で測定されるので、カレンダー時間は「相対時間」と言えますが、どのタイムゾーンにいても、同じ時点で同じ標準時点でカレンダー時間は同じです.
(3)Epochとは、特定の時点:1970-01-01 00:00:00 UTC、すなわちUnixタイムスタンプを指す.
(4)clock tick:クロックタイミングユニット(クロックドロップ回数とは呼ばない)であり、1つのクロックタイミングユニットの時間長はCPUによって制御される.1つのclock tickはCPUのクロック周期ではなく、C/C++の基本タイミング単位である.VC++のtime.hファイルでは、関連する定義を見つけることができます.
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif

#define CLOCKS_PER_SEC ((clock_t)1000)

clock_t clock( void );

この関数は、MSDNでは、「このプログラムプロセスを開く」から「プログラムでclock()関数を呼び出す」までの間のCPUクロックタイミングユニットの数を返します.
//      
    clock_t start, finish;
    start=clock();
    …
    finish=clock();
//     
    long duration=(finish- start)/ CLOCKS_PER_SEC ;

(5) time.hはまた、カレンダー時間(time_tで表される整数)を、私たちが普段見ている年月日を秒単位で表示する時間フォーマットtmに変換する2つの異なる関数も提供する.
struct tm * gmtime(const time_t *timer);                                          
struct tm * localtime(const time_t * timer);

ここで、gmtime()関数は、カレンダー時間を世界標準時間(すなわち、グリニッジ時間)に変換し、この時間を保存するためにtm構造体を返し、localtime()関数はカレンダー時間をローカル時間に変換する.例えば、現在gmtime()関数で得られている世界標準時間は2005年7月30日7時18分20秒であり、localtime()関数で中国地域で得た現地時間は世界標準時間より8時間遅れる.
(6)分解時間とは、年、月、日、時、分、秒などの成分で保存される時間構造であり、C/C++ではtm構造である.mktime()関数を使用して、tm構造で表される時間をカレンダー時間に変換できます.その関数のプロトタイプは、time_t mktime(struct tm * timeptr); この関数はgmtimeおよびlocaltime関数とは逆の役割を果たす.
参考文献
[1] http://blog.sina.com.cn/s/blog_48f3622d010008zx.html