14-9-11 C/C++課程設計--図書館管理学部---<br>中時間データ型の学習レコード
小学期C++課程設計は図書館管理システムを作る必要があり、現在の時間と時間演算を行う必要があり、ネット上でいくつかの資料を探して独学し、以下のようにまとめた.
1.カレンダ取得時間:
C++の時間プロトタイプはカレンダ時間(Calender Time)であり、現在の時間と一定の時間の差の秒数を表す.
次のように定義します.
つまり、カレンダー時間は実際には長い整形データです.time()関数を使用して現在のカレンダー時間を取得します.
戻り値は、現在のカレンダー時間です.
2.カレンダ時間(time_t)をtmタイプに変換する時間:
カレンダー時間を通常の年-月-日に変換し、時-分-秒の時間はlocaltime(time_t*timer)を呼び出してtimeが表す時間をtmの構造体に変換する必要があります.localtime()関数、tm構造体は以下のように定義されます.
また、mktime()関数を用いて、1つのtm構造体データを1つのt_に変換することができるtimeの長い整形は、この関数によって日付の不完全な部分を補完し、出力することができます.例えば、1997年7月1日が曜日であることを計算するために以下のプログラムが使用されます.
実行結果:
Tue Jul 01 00:00:01 1997
3.時間の入出力:
tm構造体は直接出力できないtime.hにライブラリ関数があるtime_tおよびtmタイプの変数は、固定フォーマットの文字列に変換され、それぞれ:
tが空でないt_であると仮定するtime変数の場合、asctime()とctime()関数の関連は次のとおりです.
4.カスタムフォーマット出力時間:
strftime()関数を使用して、出力ストリームにカスタムフォーマットの時間文字列を出力します.この関数のプロトタイプは次のとおりです.
関数の役割はtimeptrが指すtm構造体における時間の内容をformat文字列で指定されたフォーマットに従ってstrDestに出力し、maxsizeは出力最大文字数(オーバーフロー防止)を表す.
ここで、formatのフォーマット変換文字は以下の通りです.
%a曜日の略記
%A曜日のフルネーム
%b月分の略記
%B月のフルネーム
%c標準の日付の時間列
%C年の後2桁
%d十進法で表される毎月の日付
%D月/日/年
%eは2文字フィールドで、10進数で表される毎月の日付です.
%F年-月-日
%g年の後2桁の数字で、週ベースの年を使用
%G年分、週ベースの年を使用
%h略記月名
%H 24時間制の時間
%I 12時間制の時間
%j十進法で表される毎年の日付
%m 10進表記の月
%M 10時制で示す分数
%n新しい行
%pローカルのAMまたはPMの等価表示
%r 12時間
%R表示時間と分:hh:mm
%S 10進数の秒数
%t水平タブ
%T表示時間分秒:hh:mm:ss
%uは週の数日目、月曜日が初日(値は0から6、月曜日は0)
%U翌年の何週目、日曜日を初日とする(値は0から53)
%Vは年数週目、週ベースの年を使用
%w十進法で表される曜日(値は0から6、日曜日は0)
%Wは毎年数週目、月曜日を初日としています(値は0から53)
%x標準の日付列
%X標準の時間列
%y世紀を持たない10進数年(値は0から99)
%Y世紀の10進数年
%z,%Zタイムゾーン名,タイムゾーン名が得られない場合は空の文字を返す.
パーセント
4.計算時間スパン:
difftime()関数を使用して、2つの時間のスパンを計算できます.その関数のプロトタイプは次のとおりです.
実は彼は2つの時間を減らして実現したのです.
5.自分で書いた実験プログラム:
実行結果:
al@ubuntu:~/Desktop/c++$ ./test_time
Local hour is: 12
UTC hour is: 4
Fri Sep 12 04:10:20 2014
Fri Sep 12 12:10:20 2014
DATE:Friday PM 12
al@ubuntu:~/Desktop/c++$
1.カレンダ取得時間:
C++の時間プロトタイプはカレンダ時間(Calender Time)であり、現在の時間と一定の時間の差の秒数を表す.
次のように定義します.
#typedef long time_t;
つまり、カレンダー時間は実際には長い整形データです.time()関数を使用して現在のカレンダー時間を取得します.
time_t time(NUL);
戻り値は、現在のカレンダー時間です.
2.カレンダ時間(time_t)をtmタイプに変換する時間:
カレンダー時間を通常の年-月-日に変換し、時-分-秒の時間はlocaltime(time_t*timer)を呼び出してtimeが表す時間をtmの構造体に変換する必要があります.localtime()関数、tm構造体は以下のように定義されます.
struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);
struct tm {
int tm_sec; /* �C [0,59] */
int tm_min; /* - [0,59] */
int tm_hour; /* - [0,23] */
int tm_mday; /* - [1,31] */
int tm_mon; /* ( ,0 ) - [0,11] */
int tm_year; /* , 1900 */
int tm_wday; /* �C [0,6], 0 ,1 , */
int tm_yday; /* 1 1 �C [0,365], 0 1 1 ,1 1 2 , */
int tm_isdst; /* , ,tm_isdst 。 ,tm_isdst 0; ,tm_isdst() 。*/
};
また、mktime()関数を用いて、1つのtm構造体データを1つのt_に変換することができるtimeの長い整形は、この関数によって日付の不完全な部分を補完し、出力することができます.例えば、1997年7月1日が曜日であることを計算するために以下のプログラムが使用されます.
#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
struct tm t;
time_t t_of_day;
t.tm_year=1997-1900;
t.tm_mon=6;
t.tm_mday=1;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=1;
t.tm_isdst=0;
t_of_day=mktime(&t);
printf(ctime(&t_of_day));
return 0;
}
実行結果:
Tue Jul 01 00:00:01 1997
3.時間の入出力:
tm構造体は直接出力できないtime.hにライブラリ関数があるtime_tおよびtmタイプの変数は、固定フォーマットの文字列に変換され、それぞれ:
char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);
tが空でないt_であると仮定するtime変数の場合、asctime()とctime()関数の関連は次のとおりです.
printf(ctime(&t));
// :
struct tm *ptr;
ptr=localtime(&t);
printf(asctime(ptr));
4.カスタムフォーマット出力時間:
strftime()関数を使用して、出力ストリームにカスタムフォーマットの時間文字列を出力します.この関数のプロトタイプは次のとおりです.
size_t strftime(
char *strDest,
size_t maxsize,
const char *format,
const struct tm *timeptr
);
関数の役割はtimeptrが指すtm構造体における時間の内容をformat文字列で指定されたフォーマットに従ってstrDestに出力し、maxsizeは出力最大文字数(オーバーフロー防止)を表す.
ここで、formatのフォーマット変換文字は以下の通りです.
%a曜日の略記
%A曜日のフルネーム
%b月分の略記
%B月のフルネーム
%c標準の日付の時間列
%C年の後2桁
%d十進法で表される毎月の日付
%D月/日/年
%eは2文字フィールドで、10進数で表される毎月の日付です.
%F年-月-日
%g年の後2桁の数字で、週ベースの年を使用
%G年分、週ベースの年を使用
%h略記月名
%H 24時間制の時間
%I 12時間制の時間
%j十進法で表される毎年の日付
%m 10進表記の月
%M 10時制で示す分数
%n新しい行
%pローカルのAMまたはPMの等価表示
%r 12時間
%R表示時間と分:hh:mm
%S 10進数の秒数
%t水平タブ
%T表示時間分秒:hh:mm:ss
%uは週の数日目、月曜日が初日(値は0から6、月曜日は0)
%U翌年の何週目、日曜日を初日とする(値は0から53)
%Vは年数週目、週ベースの年を使用
%w十進法で表される曜日(値は0から6、日曜日は0)
%Wは毎年数週目、月曜日を初日としています(値は0から53)
%x標準の日付列
%X標準の時間列
%y世紀を持たない10進数年(値は0から99)
%Y世紀の10進数年
%z,%Zタイムゾーン名,タイムゾーン名が得られない場合は空の文字を返す.
パーセント
4.計算時間スパン:
difftime()関数を使用して、2つの時間のスパンを計算できます.その関数のプロトタイプは次のとおりです.
double difftime(time_t end, time_t start);
実は彼は2つの時間を減らして実現したのです.
5.自分で書いた実験プログラム:
#include <time.h>
#include <stdio.h>
using namespace std;
int main()
{
time_t tm1;
time(&tm1); //
tm *tm_s;
char str[40];
char temps[40];
char temps1[40];
tm_s=localtime(&tm1); // tm
printf("Local hour is: %d
",tm_s->tm_hour); //
tm_s=gmtime(&tm1);
printf("UTC hour is: %d
",tm_s->tm_hour);
printf(asctime(tm_s)); //
// &(temps[0])=ctime(&tm1); // :/home/al/Desktop/c++/test_time.cpp|22|error: incompatible types in assignment of ‘char*’ to ‘char [40]’|
printf(ctime(&tm1)); //asctime ,ctime
// ctime time_t
// , char ( 。)
// c++ ?
strftime(str,40,"DATE:%A %p %I",tm_s); //
printf("%s
",str);
}
実行結果:
al@ubuntu:~/Desktop/c++$ ./test_time
Local hour is: 12
UTC hour is: 4
Fri Sep 12 04:10:20 2014
Fri Sep 12 12:10:20 2014
DATE:Friday PM 12
al@ubuntu:~/Desktop/c++$