Linux講座にようこそ。このページは「C言語プログラミング入門 - 第14章.ライブラリ関数 - 日付および時間ライブラリ」です。

C言語プログラミング入門

14. ライブラリ関数(24/36) - 日付および時間ライブラリ(2/3)

14.37 日時の取得・変換関数

14.37.1 time関数

time関数は紀元からの経過秒数(1970年1月1日00:00:00 UTCからの経過秒数)を取得します。

【表14-5-2】 time関数
形式#include <time.h>
time_t time(time_t *timep);
返り値紀元からの経過秒数を返します。エラーの場合は((time_t) -1)を返します。
引数
time_t *timep
紀元からの経過秒数を設定する領域を指定します。返り値でも結果が返ってきますので、引数での結果が不要な場合はNULLを指定します。

14.37.2 localtime関数

localtime関数は紀元からの経過秒数を日時構造体(tm構造体)に変換します。日時はローカル標準時になりますので、通常は日本標準時(JST)に変換します。ちなみに、JSTは「協定世界時(UTC)+9時間」です。

【表14-5-3】 localtime関数
形式#include <time.h>
struct tm *localtime(const time_t *timep);
返り値日時構造体を返します。エラーの場合はNULLを返します。
引数
const time_t *timep
ローカル標準時に変換する紀元からの経過秒数を指定します。紀元からの経過秒数はtime関数で取得できます。

日時構造体(tm構造体)の内容は、次の通りです。この構造体はヘッダファイルのtime.hに宣言されています。(各メンバーの型名はint型です)

【表14-5-4】 tm構造体
メンバー名内容
tm_sec秒数で、0から59までの値です。(但し、閏秒のため60までの値は許されます。)
tm_min分数で、0から59までの値です。
tm_hour真夜中からの通算時間で、0から23までの値です。
tm_mday月はじめからの日数で、1から31までの値です。
tm_mon1月からの通算月数で、0から11までの値です。
tm_year1900年からの通算年数です。
tm_wday日曜日からの通算日数(曜日)で、0から6までの値です。(0が日曜日です。)
tm_yday1月1日からの通算日数で、0から365までの値です。
tm_isdst夏時間が有効かどうかのフラグです。正の値ならば夏時間は有効になり、0ならば無効、負の値ならばこの情報には意味がないことを表します。

14.37.3 gmtime関数

gmtime関数は紀元からの経過秒数を日時構造体(tm構造体)に変換します。日時は協定世界時(UTC)になります。

【表14-5-5】 gmtime関数
形式#include <time.h>
struct tm *gmtime(const time_t *timep);
返り値日時構造体を返します。エラーの場合はNULLを返します。
引数
const time_t *timep
協定世界時に変換する紀元からの経過秒数を指定します。紀元からの経過秒数はtime関数で取得できます。

14.37.4 mktime関数

mktime関数は日時構造体(tm構造体)を紀元からの経過秒数に変換します。tm構造体のメンバーの内容は次の様に変更されます。

  • tm_wday(曜日)とtm_yday(1月1日からの通算日数)は他のメンバーの内容から求めた値を設定します。
  • メンバーの値が有効な範囲にない場合は正規化します。例えば、11月31日は12月01日に変更します。
  • tm_isdst(夏時間が有効かどうかのフラグ)は正の値か0を設定します。
【表14-5-6】 mktime関数
形式#include <time.h>
time_t mktime(struct tm *tm);
返り値紀元からの経過秒数を返します。エラーの場合は((time_t) -1)を返します。
引数
struct tm *tm
変換するtm構造体を指定します。

14.37.5 例題

現在日時を「年/月/日 時:分:秒」の形式で表示します。

  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. int main(void)
  5. {
  6.     time_t      timep;
  7.     struct tm   *time_inf;
  8.  
  9.     /* 紀元からの経過秒数を得る */
  10.     timep = time(NULL);
  11.  
  12.     /* ローカル標準時へ変換 */
  13.     time_inf = localtime(&timep);
  14.     printf("JST:%d/%02d/%02d %02d:%02d:%02d\n",
  15.             time_inf->tm_year + 1900,   /* 年 */
  16.             time_inf->tm_mon + 1,       /* 月 */
  17.             time_inf->tm_mday,          /* 日 */
  18.             time_inf->tm_hour,          /* 時 */
  19.             time_inf->tm_min,           /* 分 */
  20.             time_inf->tm_sec);          /* 秒 */
  21.  
  22.     return 0;
  23. }
$ ./ex14_5_1.prg
JST:2009/08/20 10:34:49
$
2行目
日時の取得・変換関数を使いますので、time.hヘッダファイルを取り込みます。
10行目
現在の紀元からの経過秒数をtime関数で求めます。
13行目
現在の紀元からの経過秒数をローカル標準時にlocaltime関数で変換します。結果は日時構造体(tm構造体)のtime_inf構造体に格納します。