C言語,gmtime_r()関数でUNIX時間を要素別に変換する

スポンサーリンク

鍛錬 821

C言語,gmtime_r()関数でUNIX時間を要素別に変換する

UNIX時間(1970/01/01 00:00:00 (UTC) からの秒数)を、要素別の時刻(UTC)に変換する方法の一つとして、gmtime_r()関数を使用する方法があります。
 
以下は、gmtime_r()関数についてです。

#include <time.h>

struct tm *gmtime_r(const time_t *timep, struct tm *result);
 

引数

以下は、上記の引数についてです。

引数 意味
const time_t *timep 変換対象の時刻
struct tm *result 変換後の値が格納される構造体

構造体

以下は、構造体 tm についてです。

 
struct tm {
	int tm_sec;		// 秒 (0~60)
	int tm_min;		// 分 (0~59)
	int tm_hour;	// 時間 (0~23)
	int tm_mday;	// 日付 (1~31)
	int tm_mon;		// 月 (0~11)
	int tm_year;	// 年 (-1900)
	int tm_wday;	// 曜日 (0~6, 日曜:0)
	int tm_yday;	// 年内通算日 (0~365, 1月1日:0)
	int tm_isdst;	// 夏時間が有効か無効かのフラグ (正:有効, 0:無効, 負:このフラグは意味を持たない)
};
 

戻り値

以下は、戻り値についてです。

戻り値
struct 成功した場合 要素別の時刻(UTC)に変換された構造体のポインタ
エラーの場合 NULL
 
スポンサーリンク

プログラム

以下は、UNIX時間を要素別の時刻(UTC)に変換して表示するプログラム、test_gmtime_r.c です。

// include
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>

// main
int main(void)
{
	time_t now_time;
	struct tm tm_result;
	struct tm *tm_ret;
	
	// 現在時刻を取得(UNIX時間)
	now_time = time(NULL);
	if (now_time == -1) {
		perror("time");
		exit(EXIT_FAILURE);
	}
	printf("-- UNIX -----------------------------\n");
	printf("%ld\n", now_time);
	printf("-------------------------------------\n");
	printf("\n");
	
	// UNIX時間を,UTCで要素別の時刻に変換
	tm_ret = gmtime_r(&now_time, &tm_result);
	if (tm_ret == NULL) {
		printf("ERROR,gmtime_r()\n");
		exit(EXIT_FAILURE);
	}
	
	// 変換した要素別の時刻を表示
	printf("-- UTC ------------------------------\n");
	printf("%d (sec)\n", tm_result.tm_sec);
	printf("%d (min)\n", tm_result.tm_min);
	printf("%d (hour)\n", tm_result.tm_hour);
	printf("%d (day)\n", tm_result.tm_mday);
	switch (tm_result.tm_mon) {
		case 0:
			printf("Jan");
			break;
		case 1:
			printf("Feb");
			break;
		case 2:
			printf("Mar");
			break;
		case 3:
			printf("Apr");
			break;
		case 4:
			printf("May");
			break;
		case 5:
			printf("Jun");
			break;
		case 6:
			printf("Jul");
			break;
		case 7:
			printf("Aug");
			break;
		case 8:
			printf("Sep");
			break;
		case 9:
			printf("Oct");
			break;
		case 10:
			printf("Nov");
			break;
		case 11:
			printf("Dec");
			break;
		default:
			printf("ERROR,tm_mon\n");
			exit(EXIT_FAILURE);
	}
	printf(" (month)\n");
	printf("%d (year)\n", tm_result.tm_year + 1900);
	switch (tm_result.tm_wday) {
		case 0:
			printf("Sun");
			break;
		case 1:
			printf("Mon");
			break;
		case 2:
			printf("Tue");
			break;
		case 3:
			printf("Wed");
			break;
		case 4:
			printf("Thu");
			break;
		case 5:
			printf("Fri");
			break;
		case 6:
			printf("Sat");
			break;
		default:
			printf("ERROR,tm_wday\n");
			exit(EXIT_FAILURE);
	}
	printf(" (day of week)\n");
	printf("%d (total day (01/01-->0))\n", tm_result.tm_yday);
	if (tm_result.tm_isdst > 0) {
		printf("summer time:ON\n");
	}
	else if (tm_result.tm_isdst == 0) {
		printf("summer time:OFF\n");
	}
	else if (tm_result.tm_isdst < 0) {
		printf("summer time:This flag has no meaning.\n");
	}
	printf("-------------------------------------\n");
	
	return 0;
}

実行結果

以下は、プログラム test_gmtime.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_gmtime_r.c -o test_gmtime_r
***@ubuntu:~/***/test/c$ ./test_gmtime_r
-- UNIX -----------------------------
1587209168
-------------------------------------

-- UTC ------------------------------
8 (sec)
26 (min)
11 (hour)
18 (day)
Apr (month)
2020 (year)
Sat (day of week)
108 (total day (01/01-->0))
summer time:OFF
-------------------------------------

 
上記に示した通り、現在時刻は以下の通りであることが分かりました。

UNIX時間
1587209168
UTC
2020年04月18日(土曜日), 11時26分08秒
スポンサーリンク

シェアする

フォローする