サイトマップ / C言語講座>出入り口>総目次>目次:時刻と時間>現在時刻と年月日と曜日を表示
[現在の年月日と時刻]←このソース→[ある時刻からの経過時間]
/* #include <time.h> time_t time(time_t *timer); 例:time(&timer);
前回は、上記に示す時間に関する標準ライブラリ関数 time( ) を使って、グリニッジ標準時1970年1月1日0時0分0秒からの経過時間を得て、自前で、年月日と時間を割り出しました。しかし、標準ライブラリ関数の中にそれをやってくれる関数があります。 */
/* localtime( ) ですが、この関数を呼び出す前に time( ) を呼び出して、timer に経過時間を入れておく必要があります。
#include <time.h> struct tm *localtime(const time_t *timer); 例:time(&timer); date = localtime(&timer);
localtime( ) は、1970年1月1日0時0分0秒からの経過時間を時間を表す構造体 struct tm に変換します。UTC Time ( グリニッジ標準時 ) ではありません。ローカルタイムです。 */
/* 時間を表す構造体 struct tm を下記に示します。
struct tm { int tm_sec; // 秒 int tm_min; // 分 int tm_hour; // 時 int tm_mday; // 日 int tm_mon; // 月( 1月=0 ) int tm_year; // 西暦年 - 1900 int tm_wday; // 曜日( 日=0 ) int tm_yday; // 日(年を通して) int tm_isdst; // サマータイムフラグ };
asctime( ) は、上記の構造体を下記のような文字列に変換します。
Tue Feb 28 12:15:56 2000\n\0 #include <time.h> char *asctime(const struct tm *timeptr); 例:string = asctime(timeptr);
もし、文字列から改行コードを取り除きたい時は、 strlen( ) を使います。
#include <string.h> size_t strlen(const char *s); 例:length = strlen(string);
size_t は string.h ファイルの中で、下記のように宣言されています。
typedef unsigned size_t; または typedef unsigned long size_t;
strlen( ) を実行すると、文字列の末尾の \0 が現れる迄の字数が返ってきます。asctime( ) の時間を表す文字列では、25 が返ってくるはずです。 25字目は '\n' です。
string[strlen(string)] = '\0';
で、 '\n' を取り除くことができます。
asctime( ) は、年月日時刻をきまった文字列に変換しますが、表示の仕方を変更できません。独自のフォーマットで表示するには、下記に示す関数 strftime( ) を使います。
#include <time.h> size_t *strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr); 例:length = strftime(s, maxsize, format, timeptr);
strftime( ) はtimeptr の指す時刻を、format に従って書式化します。結果は文字列 s に書き込みます。文字列( \0 を含む )の長さが maxsize を越える場合は0を返します。
format で使用する指定子を下記に示します。
指定子 | 指定子と置き換わる文字 |
%a | 曜日の省略名 |
%A | 曜日名 |
%b | 月の省略名 |
%B | 月の名 |
%c | 日付と時刻 例:14 12:34:56 |
%d | 日付 |
%H | 時間( 00から23 ) |
%I | 時間( 01から12 ) |
%j | 年間の通し日数( 001から366 ) |
%m | 月( 01から12 ) |
%M | 分( 00から59 ) |
%p | AM/PM |
%S | 秒( 00から59 ) |
%U | 年間の経過週数(日曜を1日目として) |
%w | 曜日(日曜を0として) |
%W | 年間の経過週数(月曜を1日目として) |
%x | 日付 例:02/11/00 |
%X | 時刻 例:12:34 AM |
%y | 西暦の下二桁 |
%Y | 西暦 |
%Z | タイムゾーンの名 |
%% | % |
今回のソースプログラムでは、経過時間を取得して、それを時間を表す構造体 date に変換して、asctime( ) と strftime( ) で表示します。 */
#include <stdio.h> #include <time.h> void main(void) { time_t timer; struct tm *date; char str[256]; timer = time(NULL); /* 経過時間を取得 */ date = localtime(&timer); /* 経過時間を時間を表す構造体 date に変換 */ printf("printf(\"%%s\\n\", asctime(date));\n"); /* 次の行を表示 */ printf("%s\n", asctime(date)); /* 構造体 date を文字列に変換して表示 */ printf("\"%%Y, %%B, %%d, %%A %%p%%I:%%M:%%S\"\n"); /* 次の行の書式文字列を表示 */ strftime(str, 255, "%Y, %B, %d, %A %p%I:%M:%S", date); printf("%s\n", str); } |
/* asctime( ) に似たライブラリ関数に、ctime( ) があります。
#include <time.h> char *ctime(const time_t *timer); 例:string = ctime(&timer);
ctime( ) は、localtime( ) を呼ぶことなしに、時間を表す文字列に変換します。以下のコードと同等です。
asctime(localtime(timer));
この文字列の例を下に示します。この文字列は26文字で、末尾から2番目の文字は改行コードです。
Tue Feb 28 12:15:56 2000\n\0
*/
[現在の年月日と時刻]←このソース→[ある時刻からの経過時間]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−