1-18. 日付と時刻

公開日: 8:32 1. 基本編/1-18. 日付と時刻

C++標準ライブラリは適切な日付型を備えていません。C++は日付と時間操作のための構造体と関数をCから継承しています。日付と時間に関連した関数と構造体を利用するためには、 <ctime>ヘッダファイルをインクルードする必要があります。時間に関係する型は4つあり、clock_ttime_tsize_ttmです。clock_t、time_t、size_t型はシステム時間と日付を整数の並びで表現することが可能です。
tm構造体はC構造体の形式で日付と時間を保持し、次の要素を持ちます。

struct tm {
  int tm_sec;   // 0 から 61 の秒
  int tm_min;   // 0 から 59 の分
  int tm_hour;  // 0 から 24 の時
  int tm_mday;  // 1 から 31 の日
  int tm_mon;   // 0 から 11 の月
  int tm_year;  // 1900 からの年
  int tm_wday;  // 日曜日からの日付
  int tm_yday;  // 1月1日からの日付
  int tm_isdst; // サマータイムの時間
}
次の関数はCまたはC++で日付や時間を扱う上で重要なものです。これらの関数はC/C++標準ライブラリの一部です。
構文用途
time_t time(time_t *time)システムのカレンダー時間を1970年1月1日からの経過した秒で返す。システムが時間を保持していなければ、0.1が返る
char *ctime(const time_t *time);日付 月 年 時間:分:秒の形式の文字列へのポインタを返す
struct tm *localtime(const time_t *time);ローカル時間を表すtm構造体へのポインタを返す
clock_t clock(void);呼び出し元のプログラムの実行時間の近似値を返す。時間が無効なときは0.1が返る
char * asctime ( const struct tm * time );日 月 日付 時間:分:秒の形式に変換された、時間を指す構造体に保持された情報を含む文字列へのポインタを返す
struct tm *gmtime(const time_t *time);tm構造体の形式で時間へのポインタを返す。この時間はUTCで表され、実質的にGMTである
time_t mktime(struct tm *time); カレンダー時間を返し、時間を示す構造体にあるものと同等
double difftime ( time_t time2, time_t time1 );この関数はtime1とtime2の秒数の差を計算する
size_t strftime();この関数は特定の日付と時間形式に使われる

現在の日付と時刻

現在の時刻と日付をローカル時間またはUTC時間のいずれかで受け取ることを考えてみます。次の例は同じことを達成します。
#include <iostream>
#include <ctime>

using namespace std;

int main()
{
   // システム準拠の現在の日付と時刻
   time_t now = time(0);
   
   // 文字列へ変換
   char* dt = ctime(&now);

   cout << "ローカル時間は:" << dt << endl;

   // UTC用にtm構造体へ変換
   tm *gmtm = gmtime(&now);
   dt = asctime(gmtm);
   cout << "UTC時間は:"<< dt << endl;
}
上のコードをコンパイルし実行すると、次の結果が得られます。
ローカル時間は:Fri Feb 19 10:42:15 2016
UTC時間は:Fri Feb 19 01:42:15 2016

tm構造体を使った時間フォーマット

C、C++のいずれにおいても日付と時間を扱う上でtm構造体は非常に大切です。これまで述べてきたように、この構造体はCの構造体の形で日付と時刻を保持しています。時間関連の関数の殆どはtm構造体を利用します。様々な日付と時刻に関連した関数とtm構造体の使用例を示します。 このページでは構造体を使用していますが、Cの構造体へどのように->(アロー演算子)を使ってアクセスするか基本的な理解があると想定しています。
#include <iostream>
#include <ctime>

using namespace std;

int main()
{
   // システムの現在の日付/時刻
   time_t now = time(0);

   cout << "1970年1月1日からの秒数:" << now << endl;

   tm *ltm = localtime(&now);

   // tm構造体の要素を出力
   cout << "年: "<< 1900 + ltm->tm_year << endl;
   cout << "月: "<< 1 + ltm->tm_mon<< endl;
   cout << "日付: "<<  ltm->tm_mday << endl;
   cout << "時刻: "<< ltm->tm_hour << ":";
   cout << ltm->tm_min << ":";
   cout << ltm->tm_sec << endl;
}
上のコードをコンパイルし実行すると、次のような結果が得られます。
1970年1月1日からの秒数:1455846359
年: 2016
月: 2
日付: 19
時刻: 11:46:60
  • ?±??G???g???[?d????u?b?N?}?[?N???A

0 件のコメント :

コメントを投稿