質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

4545閲覧

C言語でgmtime()関数の位置によって取得できる時間が変わるのはなぜでしょうか。

tada_tadaa

総合スコア110

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

2グッド

1クリップ

投稿2016/02/09 06:26

お世話になっております。
またC言語で疑問がわいてきたので質問させていただきます。
以下のようなプログラム文があります。

c

1#include <stdio.h> 2#include <time.h> 3 4int main(void) 5{ 6 struct tm *systime, *systimeg; 7 time_t t; 8 9 t = time(NULL); 10 systime = localtime(&t); 11 systimeg = gmtime(&t); 12 13 printf("時刻: %.2d:%.2d:%.2d:\n", systime->tm_hour, systime->tm_min, systime->tm_sec); 14 printf("日付: %.2d/%.2d/%.2d\n", systime->tm_mon+1, systime->tm_mday, systime->tm_year +1900); 15 16 //systimeg = gmtime(&t); 17 printf("時刻: %.2d:%.2d:%.2d:\n", systimeg->tm_hour, systimeg->tm_min, systimeg->tm_sec); 18 printf("日付: %.2d/%.2d/%.2d\n", systimeg->tm_mon+1, systimeg->tm_mday, systimeg->tm_year +1900); 19 20 return 0; 21}

出力結果は
時刻: 06:07:19:
日付: 02/09/2016
時刻: 06:07:19:
日付: 02/09/2016
で、localtime()関数とgmtime()関数の取得した時間が同じになっています。
localtime()関数はシステム時刻、gmtime()関数は世界標準時刻(グリニッジ標準時)を返します。
しかし、gmtime()関数の位置を下に示す文のように移動させれば結果は
時刻: 15:13:19:
日付: 02/09/2016
時刻: 06:13:19:
日付: 02/09/2016
というふうに正しい結果が得られます。

c

1#include <stdio.h> 2#include <time.h> 3 4int main(void) 5{ 6 struct tm *systime, *systimeg; 7 time_t t; 8 9 t = time(NULL); 10 systime = localtime(&t); 11 //systimeg = gmtime(&t); 12 13 printf("時刻: %.2d:%.2d:%.2d:\n", systime->tm_hour, systime->tm_min, systime->tm_sec); 14 printf("日付: %.2d/%.2d/%.2d\n", systime->tm_mon+1, systime->tm_mday, systime->tm_year +1900); 15 16 systimeg = gmtime(&t); 17 printf("時刻: %.2d:%.2d:%.2d:\n", systimeg->tm_hour, systimeg->tm_min, systimeg->tm_sec); 18 printf("日付: %.2d/%.2d/%.2d\n", systimeg->tm_mon+1, systimeg->tm_mday, systimeg->tm_year +1900); 19 20 return 0; 21}

ここで疑問がわいてきまして、systimegには最初のプログラム文でもsystime = localtime(&t);が
実行された直後にsystimeg = gmtime(&t);が実行されて世界標準時刻が代入されていると
思ってたのですが、実際に出力してみるとシステム時刻が代入されているようです。
なぜsystimeg = gmtime(&t);を書く位置によって取得される時刻が変わるのか疑問です。
どなたかお分かりの方がいれば教えていただければと思います。

afroscript, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

localtime()とgmtime()は、頭の痛いことに内部に持っているグローバルな変数領域struct tmに結果を設定して、そこへのポインタを返却します。
tada_tadaaさんが使われている標準ライブラリはlocaltime()とgmtime()が同じstruct tm領域を使っているのだろうと思います。
であれば、下記処理を行うと、最初に設定されたlocaltime()の結果がgmtime()で上書きされている筈です。

C

1systime = localtime(&t); 2systimeg = gmtime(&t);

投稿2016/02/09 06:39

編集2016/02/09 06:40
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tada_tadaa

2016/02/09 07:08

ご回答ありがとうございます。 >localtime()とgmtime()は、頭の痛いことに内部に持っているグローバルな変数領域struct tmに結果を設定して、そこへのポインタを返却します。 tada_tadaaさんが使われている標準ライブラリはlocaltime()とgmtime()が同じstruct tm領域を使っているのだろうと思います。 であれば、下記処理を行うと、最初に設定されたlocaltime()の結果がgmtime()で上書きされている筈です。 なるほどと思いました。僕はてっきりsystimeとsystimegを関数内だけの変数のように思ってました が、systimeとsystimegはポインタであって、結果は外部の同一部分に保存されているようだと理 解しました。だから systime = localtime(&t); systimeg = gmtime(&t); の文ではlocaltime()の結果がgmtime()で上書きされているっぽいんですね。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問