私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と説明しています。
「じゃあ、カレンダー時間って何?」と思いますが、「カレンダー時間」というものの説明は見当たりません。

time_tというのは整数と考えてよいのでしょうか。
time_tで変数宣言すると、プログラムを読む人が「あ、これは時間を表すんだな」とわかり易いから、time_tというものがあるのでしょうか。

それとも、
time_tが秒数を表すかどうかは処理系に依存するのでしょうか。

もし、1970年1月1日からの秒数を表すなら、time関数の戻り値を1年間の秒数で割って1970に足せば今何年かわかるプログラムになりそうですよね。(うるう年や時差は考慮する)
それとも、それは処理系によっては正しく動かないプログラムになるのでしょうか。
(あくまでも考え方です。確か、time_tを渡せば年月日時分秒を返す関数があると思います。)



ちなみに、おとといプログラムを作ってtime関数の戻り値を10進数で表示すると次のようになりました。(VC++)


==============プログラム==============

#include <stdio.h>
#include <time.h>

int main(void)
{
time_t a;
a=time(NULL);
printf("%d\n",a);

return(0);
}

================結果===============

1005300371

このQ&Aに関連する最新のQ&A

A 回答 (7件)

> C99とは、ISOの規格で比較的新しいものと思います。



そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0時0分0秒からの経過秒数」というのは慣例に過ぎません。

とはいえ、UNIXを起源とする『time_tはlong』と『time()は1970年1月1日0時0分0秒からの経過秒数』という約束事は変えられる事は無いでしょう。
C98/C89との互換性を保ちながら新規格を作ることが予想されるからです(そうでなければlong longなどという型は作らないはず)。
その意味でyoushirさんのおっしゃるとおりだと思います。

この回答への補足

(締め切る前に―――ここの回答とは直接の関係はないですが)

time関数は、失敗したとき(無効の場合)、
(time_t)-1、つまり、time_tでキャストした-1
を返します。

(質問は規格に関するものですが、規格のことは置いておいて。)
戻り値が負の数である可能性があることを考えると、time関数の戻り値の型は、
符号付きの型になっているのが自然のように思われます。

(キャストすれば何でもいいだろう、という考えは、確かにそれはそうですが。)

補足日時:2001/11/15 23:22
    • good
    • 1
この回答へのお礼

>時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。

ということは、C言語の本で
time関数はいついつからの秒数を返します、
などと書かない理由は自明ですね。

(No.6の回答より)
>ANSI-Cにおいて「time_tは整数値」という規定があります。
time_tが整数値でなくてはいけないのか(time_tがdoubleでも規格に反しないのか)という点まで突っ込んで考えればきりはないですが、
私のような初級者がそこまで知る必要もないでしょう。

(質問から)
>それとも、それは処理系によっては正しく動かないプログラムになるのでしょうか。
そういう可能性があるということですね。

お礼日時:2001/11/13 22:29

ANSI-Cにおいて「time_tは整数値」という規定があります。


よってC98ではshortまたはlong、C99ではshort/longまたはlong longのいずれかとなります。

この回答への補足

ご回答ありがとうございます。

わたしの知識が正しいか、自信がないですが…

C99とは、ISOの規格で比較的新しいものと思います。
(C98というのは知りませんでした。)

今、私の手元に『新ANSI C言語辞典』(技術評論社)という本があるのですが、それによると、

・time_tは算術型である。
・算術型とは、汎整数型と浮動小数点型の総称。

ということがわかりました。
ご回答に照らしても、
「time_tが構造体であっても、 問題ないわけですね」(#4補足)なる私の発言は暴論であることがわかります。(ANSI C の場合。)

しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか(ANSI C の場合)。(もしかして、これも暴論かもしれません。)


こういうことは言えませんか?

time_t型が1970年1月1日0時からの秒数だと規格で決まっているならば、time関数の戻り値の説明をするときに、
戻り値はカレンダー時間(暦時間)である、
などと奥歯にものの挟まったような言い方をしないで、素直に「1970年1月1日0時からの秒数」だと言えばよいと思いませんか?

補足日時:2001/11/12 23:01
    • good
    • 0

こんにちは、



>時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、time_tが構造体であっても、
>C言語としては問題ないわけですね ?

時間関係は、混乱しやすいですよね。

多分その目的には、tm 構造体というのが適しているように思います。

また、独自の時刻データ型を作る場合は、MyTime_t などのように、他の人にもわかる名前にする事をお勧めします。

確かに自分だけが見る趣味のプログラムなら、「time_tが構造体であっても、C言語としては問題ない」ですけど、他の人が見る仕事関係のプログラムでは、標準(言い換えると常識的)ではない定義があると、他の人はすんごく迷惑します。
少なくとも私の回りでは、そのようなことは「禁止」にしています。「エラーが出ないからOK」とか「このほうが(自分で)わかりやすい」からと好き放題したプログラムのトラブルを直す実力になり、同様の事を経験したら、このことは、実感としてご理解いただけると思います。
(このような「前提が変」という問題だけは、よく泣かされます)

初心者の方ということなので、今後を思いあえて書かせていただきました。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2001/11/12 23:08

小生はC++Buiderですが、


time.h を見ますと次のように定義してありました。
typedef long time_t;
以上です.

この回答への補足

ありがとうございます。

私の本来の質問は
「C言語と呼ぶにあたって、time_tが整数である必要はあるのか」
という点に質問の重点があったわけですが、
#1の補足で述べましたように、私は
「実際にそのような(整数でない)処理系はあるのでしょうか。 」
ということもあわせて聞いています。

後者に関することとしてお答えいただいたわけですね。C++Buiderもlongだということですね。
参考になります。


皆さんにご確認を取りたいと思います。
time_tが1970年1月1日からの秒数だということはC言語として必須ではなくて、
時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、time_tが構造体であっても、
C言語としては問題ないわけですね ?

補足日時:2001/11/11 16:08
    • good
    • 0

>time_t型とは何でしょうか。


現在時刻を返すための型です。

intとしないのは、今後、例えば128bit整数が必要になった場合でも,
インクルードファイルやライブラリを変えて、コンパイルしなおすだけで対応できるようにするためです。

当然,intでなくても構いませんし,2038年までには変わるだろうとは思います。
32bit整数だと2038年に桁数がたりなくなるからです。
既にそうなっているOSもあるだろうと思います。

もし、intとしてコーディングすると、こういう変更がおきた場合に、ソースコードレベルで修正が必要です。
それも、どこにどの程度あるのか簡単にわかりませんから、手間もかなりかかります。

また、他の環境では現在でも違う可能性がありますから、同じソースを違う環境で動作させるためにも
time_t型にしておく必要はあります。

参考URL:http://member.nifty.ne.jp/shyu/20xx/2038.htm
    • good
    • 0
この回答へのお礼

とてもよくわかりました。

「time_tって書いてあると時刻ということがわかり易いから、time_tというのがある」というよりも(そういう側面もありますが。)、
long型では、いちいちソースを見て直さなければいけないため、2038年問題に対処するのが困難だ、ということですね。


2の31乗 = 2,147,483,647秒 = 68年とちょっと・・
(参考URLより。)


>他の環境では現在でも違う可能性がありますから、同じソースを違う環境で動作させるためにも
>time_t型にしておく必要はあります。
よくわかりました。

お礼日時:2001/11/11 14:33

補足読みました。


time_tがlong/intでない処理系ということですが、たいていのC言語の環境はANSI C+拡張であることから考えても、まず問題はないと思います。
#手元にANSI Cの環境がないので、何ともいえませんが。

もう少しほかの方の環境も聞いてみてもいいかもしれませんね。
ではでは☆
    • good
    • 0

一応Visual C++ではtime.hの中にtime_tはlongという風に宣言してありますね。



従って、中身は単純なlong型。一応これは対外の環境で問題は出ないと思いますよ。ただ、MSDNにはlong intと書かれているので、int型(longと同等の)と扱われる場合もあるようです。long宣言しておけば問題はないと思います。

まぁ、time_tを使う理由はやはり「みてすぐにわかるから」だと思いますよ。
ではでは☆

この回答への補足

ありがとうございます。

>Visual C++ではtime.hの中にtime_tはlongという風に宣言してありますね。
>time_tを使う理由はやはり「みてすぐにわかるから」だと思いますよ。

Visual C++の場合はわかりました。
そうすると、問題は、Visual C++に限らない「C言語一般」の場合はどうなのか、ということになりますね。

time_tがlongでもintでもない処理系があっても、C言語の規格として問題はないのでしょうか。
また、実際にそのような処理系はあるのでしょうか。

(なお、今私の扱っているコンピュータには、Cどころかプログラミング環境がないので、VC++のこともわかりません。今は。)

補足日時:2001/11/11 11:57
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qc型肝炎はHしたらうつるのでしょうか?

今c型肝炎がテレビのニュースとかに出てるのですけど血液感染以外にエイズみたいにHしたら相手にうつるのでしょうか?
まったく知識がないので教えていただけませんか?
 

Aベストアンサー

C型肝炎が性行為で感染する確率は低いとされています。
しかし、血液感染するものですから、コンドームの使用をお勧めします。
性交渉の際、目には見えないような細かな傷が多数できるのです。そういった傷からの血液感染という可能性を否定することができませんから。
以上kawakawaでした

QC言語のプログラムで#includeを使わず#includeだけで

C言語のプログラムで#include<math.h>を使わず#include<stdio.h>だけで√(sqrt)を表現することは可能でしょうか?

Aベストアンサー

ご自分で sqrt 関数を作れば可能です。
こんな感じでしょうか。

#include <stdio.h>

static double
sqrt (double s)
{
 double x = s / 2.0;
 double last_x = 0.0;

 while (x != last_x)
 {
  last_x = x;
  x = (x + s / x) / 2.0;
 }

 return (x);
}

int
main (int argc, char * argv[])
{
 printf ("sqrt (%f) = %f\n", 3.0, sqrt (3.0));
}

QB型肝炎のキャリアです。うつる??

19歳、遺伝性のB型肝炎のキャリアです。Hするときは相手の方にうつりますか??付き合って2ヶ月の彼氏がいて、きっとバレンタインに初Hすると思います。処女なので、出血するかもなんですが、その血で感染。。。なんてことはないですか?コンドームは絶対に使うつもりですが、心配です・・・。

Aベストアンサー

同じくキャリアです
Hしましたが、
ナニも起こりませんでした
相手の体の都合にもよるのでは?
感染の可能性はありますが、抗体を持つことが出来る
体質であれば何も問題は起きないものです
でも一応相手の了解は取ったほうがいいかと・・・

Q_T("abcdef") の_Tってなんですか?

たまに、
  lstrcpy( ... , _T("abcdef") );
こんな感じで _T が、ついているのがあるのですが、これはいったいなんですか?

Aベストアンサー

 結論から言えば「ソースコードをいっさい修正せずにUnicode対応をするためのマクロ」です。

 lstrcpy()の第2引数の型は、char*ではなく「LPCTSTR」型になってますよね。_T()は、文字列をchar*型ではなくLPTSTR型にするマクロです。(LPCTSTRはconstなLPTSTR)

 では、LPTSTRとは何か。これはTCHAR型へのポインタです。ではTCHARは何か。

 TCHARは次のように定義されています。

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

つまり、マクロ定数「_UNICODE」が定義されていればTCHARの正体はwchar_t、そうでなければcharになります。

 char型に日本語文字を入れたとき、ご存知のようにシフトJISコードにされて入ります。一方、wchar_tに入れたときにはUnicodeで入ります。

 最近のWindowsソフトは国際化のために、内部文字コードにUnicodeを使うことが多くなっています。いまはシフトJISを使っているソフトでも、将来はUnicodeに移行することが見込まれます。

 しかしUnicodeに移行するときに、ソースをいちいち修正していては大変です。そこで、文字列はあらかじめ_T()で囲っておくのです。

 コンパイルオプション「/D "_UNICODE"」でマクロ定数を立てて再コンパイルしてやれば、即、Unicodeへの移行が完了するというわけです。

 結論から言えば「ソースコードをいっさい修正せずにUnicode対応をするためのマクロ」です。

 lstrcpy()の第2引数の型は、char*ではなく「LPCTSTR」型になってますよね。_T()は、文字列をchar*型ではなくLPTSTR型にするマクロです。(LPCTSTRはconstなLPTSTR)

 では、LPTSTRとは何か。これはTCHAR型へのポインタです。ではTCHARは何か。

 TCHARは次のように定義されています。

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

つまり、マクロ定数「_UNICODE...続きを読む

QC型肝炎は尿でもうつるの?

身内にC型肝炎の患者がいるのですが、
便座についていたその患者の尿に気づかず
その上に座ってしまいました。血液で感染することは
知っているのですが、尿でも感染するのかと
気になっています。どうか、教えてください。

Aベストアンサー

気になるのなら調べましょうよ
C型は基本的に血液感染です むかーーーしは輸血とかってのが多かったですけどね こっちに関しては今は無いです
今あるのは麻薬とかの針の使いまわしですかね。
性行為感染とか母子感染とかもなくは無いですがほぼないと思ってください。

つまりその尿が血尿とかで今すぐでた物であり あなたの体内に入り直接粘膜に触れなければ感染しません。
便座についていた程度であれば感染確率は0です

Q.NET 2003 DateTimeからtime_t型への変換

.NET 2003 C++です。
フォーム上にカレンダを置いて選択された日時をDateTime型で管理しています。

ところが、途中でどうしても使用しなければいけないクラスへの時間の引数がtime_t型なのです。

その為、DateTimeからtime_tへの変換を模索していますが、よくわかりませんでした。どなたかお知恵をおかしください。

Convertでは、Stringへの変換しか対応してません。
Stringからtime_tへの変換の仕方でもいいんですが。

※ミリ秒は使用しません。

Aベストアンサー

正攻法としては、tm構造体を設定してからmktime関数を呼び出します。

tm構造体にはいろいろなフィールドがありますが、年月日と時分秒だけ設定すれば、後は不定でも大丈夫です。(念のため0で初期化しておきましょう)

QB,C型肝炎が歯科治療でうつる可能性は?

 上記の通りです。
ポイントは、歯医者での口腔処置の場合、一人一人使い捨てでない機器があると思うのですが、処置時に出血もありますのでB,C型肝炎の感染の可能性があるのではないかと思うのですがいかがでしょう?

Aベストアンサー

使い捨てでない機材であっても、リンク先のような消毒を行えば
ウイルスは除去されるようです。

しかしながら、消毒をされていない機器であれば、感染の可能性はあるということになります。
消毒していない機器を使っているような歯科があったとしたら、
ウイルスを撒き散らしているようなものです。

歯科の機器や理髪店のかみそりなど消毒が十分であると祈っています。

参考URL:http://www.mhlw.go.jp/bunya/kenkou/kekkaku-kansenshou09/02-10.html

QC言語のtime_tに関して

こんにちは。

今現在、C言語にてプログラミングを行っております。time_tを用いましたが、4月などの2桁目が0のは巧く取得できたのですが、日にちの2桁目が0にならず、空白となってしまいます。

一応、ソースを載せておきますが見辛いのが申し訳ないです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

time_t timer;
struct tm *local;
struct tm *utc;

extern char today[20];
extern char today2[20];
extern char today_year[10];
extern char today_month[2];
extern char today_day[2];

void day(){
char *ptr;
/* 現在時刻を取得 */
timer = time(NULL);

local = localtime(&timer); /* 地方時に変換 */

/* 地方時 変換後表示 */
printf("地方時: ");
printf("%4d/", local->tm_year + 1900);
printf("%2d/", local->tm_mon + 1);
printf("%2d ", local->tm_mday);

if(local->tm_mday<10)



//system("pause");
// printf("%2d:", local->tm_hour);
// printf("%2d:", local->tm_min);
// printf("%2d", local->tm_sec);
// printf(" %d\n", local->tm_isdst);


/*****************************/
sprintf(today_year,"%4d", local->tm_year + 1900);
sprintf(today_month,"%2d", local->tm_mon + 1);
sprintf(today_day,"%2d", local->tm_mday);


if((local->tm_mon+1)<=9)
today_month[0]='0';
if((local->tm_mday+1)<=9)
today_day[0]='0';

sprintf(today, "%s-%s-%s", today_year, today_month, today_day);
sprintf(today2, "%s/%s/%s", today_year, today_month, today_day);
//printf("%s",today);
/*****************************/
// utc = gmtime(&timer); /* 協定世界時(UTC)に変換 */

/* 協定世界時 変換後表示 */
// printf("\n\n\n\n協定世界時: ");
// printf("%4d/", utc->tm_year + 1900);
// printf("%2d/", utc->tm_mon + 1);
// printf("%2d ", utc->tm_mday);
// printf("%2d:", utc->tm_hour);
// printf("%2d:", utc->tm_min);
// printf("%2d", utc->tm_sec);
// printf(" %d\n", utc->tm_isdst);

return;
}

どなたかご教示下さい。

こんにちは。

今現在、C言語にてプログラミングを行っております。time_tを用いましたが、4月などの2桁目が0のは巧く取得できたのですが、日にちの2桁目が0にならず、空白となってしまいます。

一応、ソースを載せておきますが見辛いのが申し訳ないです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

time_t timer;
struct tm *local;
struct tm *utc;

extern char today[20];
extern char today2[20];
extern char today_year[10];
extern char today_month[2];
extern ...続きを読む

Aベストアンサー

> if((local->tm_mon+1)<=9)
> today_month[0]='0';
> if((local->tm_mday+1)<=9)
> today_day[0]='0';

こんなことしなくても、sprintfだけで0詰めできます。
sprintf/printfのマニュアルや解説をよく読んでみましょう。

> time_t timer;
> struct tm *local;
> struct tm *utc;

これらは、なぜグローバル変数になっているのでしょうか?
他で使うわけではないので、ローカル変数でいいのでは?

> extern char today[20];
> extern char today2[20];
> extern char today_year[10];

これらも、なぜグローバル変数なのでしょうか?
ポインタ渡しや返り値を使うのではなく、グローバル変数に結果を返す方がよい、という明確な理由はありますか?

> extern char today_month[2];
> extern char today_day[2];

C言語でよくやってしまう間違いです。
何文字までの文字列が収納できるサイズか、よーーーく考えてみましょう。

C言語には、配列の範囲を越えて利用しても、それ自体はエラーにならない、という特徴があります。
しかし、それが「期待通り」に動作するか保証はありません。

> if((local->tm_mon+1)<=9)
> today_month[0]='0';
> if((local->tm_mday+1)<=9)
> today_day[0]='0';

こんなことしなくても、sprintfだけで0詰めできます。
sprintf/printfのマニュアルや解説をよく読んでみましょう。

> time_t timer;
> struct tm *local;
> struct tm *utc;

これらは、なぜグローバル変数になっているのでしょうか?
他で使うわけではないので、ローカル変数でいいのでは?

> extern char today[20];
> extern char today2[20];
> extern char today_year[10];

これらも、なぜグローバル変...続きを読む

Qキスでうつるものは

ある風俗嬢のブログにこう書かれていました。
¨キス感染¨
A型肝炎、B型肝炎、C型肝炎。
咽頭クラミジア、咽頭淋病。
HIVウィルス感染=エイズ。

キスでうつります。
キスで簡単にうつる。

あ、、歯周病も歯肉炎もね!!

みんなにありえる可能性。
SEXよりも身近な可能性。
キス感染。


とありましたが、この中で本当にキスで感染する可能性のあるもの

そしてそれに感染した場合に完全に直る病気なのか
完治は難しいのかを教えてください。

Aベストアンサー

咽頭クラミジア、咽頭淋病、口腔ヘルペスは移ります
歯周病は歯周病菌を持っていない人(赤ちゃんなどです。風俗に行く方で歯周病菌を持っていない、という方がいるとは思えませんが…)なら移ります

ヘルペスなど痒痛いブツブツができてかなり辛いです
確かに防ぎようがないという点でHIVより身近でキケンといえますね

Q特定のタイムゾーンからtime_tを得る方法

こんにちは。

サポートが終わってしまったVC++6.0で開発した案件の改造を行っています。OSはWindowsXPです。
その中で、time_t(32ビット)をインタフェースとするライブラリを使う必要が要件上あるのですが、その元になる日時情報が、世界各地のログ情報の中の日時情報で、その形式が各地のタイムゾーンによる文字列("2012/03/21 12:34:56")になっていています。各ログがどのタイムゾーンかは分かるので、TzSpecificLocalTimeToSystemTime関数を使えばUTCのSYSTEMTIME構造体には変換できそうなのですが(マニュアルを見ただけで試してはいません)、それをtime_tに変換する方法が分からず、困っています(mktimeなどは変換元をローカルタイムとして扱うため)。自分で計算するライブラリでも結構ですので、何か良い変換方法がありましたら、ぜひご教授頂きたいのですが。
またVC++6.0なので、.NET Frameworkを使わない方法での対応で考えております。

よろしくお願い致します。

Aベストアンサー

SYSTEMTIME が得られるなら、そこから SystemTimeToFileTime で、
FILETIME=1601 年から 100 ナノ秒単位の時間が得られます。

FILETIME値から time_tの起点である「1970年1月1日0時0分0秒のFILETIME値」=「116444736000000000」を引いて、
10000000(1秒と100ナノ秒の比)で割れば、エポック秒に変換できます。
(あるいは、10000000で割ってから、11644473600を引いてもいいでしょう)

変換方向は逆ですが、上記定数の根拠については
http://support.microsoft.com/kb/167296/ja
が参考になるでしょうか。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報