C言語関係掲示板

過去ログ

No.359.指定日の3日前をもとめるには

[戻る] [ホームページ]


No.2339

指定日の3日前をもとめるには
投稿者---良(2002/08/08 17:47:59)


指定した任意の日付の3日前を求めたいのですが
どうすればよいのですか。

「200208008」の3日前だと、「20020805」に
なりますが、この20020505を求めたいのですが。

No.2341

Re:指定日の3日前をもとめるには
投稿者---ともじ(2002/08/08 20:02:04)


こんばんは。

>指定した任意の日付の3日前を求めたいのですが
>どうすればよいのですか。

tm構造体に年月日を設定。それ以外は0で構いません。
mktime関数でtime_t型に変換。
変換値から3日分の秒を減算。
localtime関数で再びtm構造体を取得。
ではどうでしょう。
ただし、1970年以前は計算できないかもしれません。

mktimeとlocaltimeは
http://www9.plala.or.jp/sgwr-t/lib/libtop.html
を参照してください。


No.2345

Re:指定日の3日前をもとめるには
投稿者---さとい(2002/08/09 01:09:53)


>指定した任意の日付の3日前を求めたいのですが
>どうすればよいのですか。
>
指定した年月日を秒に変換し、そこから何日前の秒を引けば求められます。
たとえば、3日前なら、3600 * 24 * 3 = 259200秒を引きます。

getdate関数で、年月日をtm構造体に設定します。
getdate関数は、あらかじめ決められた書式の年月日でないとtm構造体に
格納できません。
mktime関数で通算秒に変換し、3日分の秒を引きます。
localtime関数で再び、tm構造体に設定します。
strftime関数で、好きな書式で表示します。

となります。

No.2346

Re:指定日の3日前をもとめるには
投稿者---かずま(2002/08/09 03:11:07)


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

int calc_date(int *y, int *m, int *d, int n)
{
    struct tm t = { 0 };

    t.tm_year = *y - 1900;
    t.tm_mon  = *m - 1;
    t.tm_mday = *d + n;
    if (mktime(&t) == -1) return 0;
    *y = t.tm_year + 1900;
    *m = t.tm_mon + 1;
    *d = t.tm_mday;
    return 1;
}

int main()
{
    int y = 2002, m = 8, d = 8;

    if (calc_date(&y, &m, &d, -3))
        printf("%4d/%02d/%02d\n", y, m, d);
    return 0;
}
mktime を使うのなら、秒の計算も localtime も不要です。
ただ、2038年問題が気になります。

No.2347

Re:指定日の3日前をもとめるには
投稿者---ともじ(2002/08/09 08:43:52)


おはようございます。いつもありがとうございます。

>mktime を使うのなら、秒の計算も localtime も不要です。
>ただ、2038年問題が気になります。

mktimeだけだと月をまたがるとLSIC試食版はどうもうまく
計算してくれません。
かずまさんの提示してくださったプログラムで
n=-10を指定すると 2002/08/-2 になってしまいます。
gmtimeもLSICは日本時間を出力してきます。
理由をご存知でしたら、お教えください。


No.2349

Re:指定日の3日前をもとめるには
投稿者---かずま(2002/08/11 17:47:01)


> mktimeだけだと月をまたがるとLSIC試食版はどうもうまく計算してくれません。
> gmtimeもLSICは日本時間を出力してきます。

単に LSI C-86 Ver 3.30c (1993/8/19) 試食版のバグでしょう。
LSI Japan のホームページに行くと、製品版は Ver 3.5 になっていますし、
サポートページ行くと、さらに Ver 3.5.9 が出ています。

試食版はフリーであり、サポートは全くないので、1993年以降、バグの修正は
されていないはずです。scanf の %n も正しい値を返さないし、a ? b, c : d
という式もコンパイルできないなど、私もいくつかのバグに遭遇しています。

mktime に関しては、gcc, VC++, BC++ などは規格書どおり正しい結果を返します。

No.2350

Re:指定日の3日前をもとめるには
投稿者---kikk(2002/08/11 18:23:49)


ども。


>gmtimeもLSICは日本時間を出力してきます。
>理由をご存知でしたら、お教えください。

環境変数TZが設定されていないのではないでしょうか?
詳細はLSI C のユーザーズマニュアルの 1.2 環境の設定 を参照して
ください。また、BCBのランタイムライブラリリファレンスのgmtime()の
使用例も参考になるかと。


では。

No.2363

Re:指定日の3日前をもとめるには
投稿者---ともじ(2002/08/13 11:18:56)


返信ありがとうございます。

>>gmtimeもLSICは日本時間を出力してきます。
>>理由をご存知でしたら、お教えください。
>
>環境変数TZが設定されていないのではないでしょうか?

kikkさんのおっしゃる通り、TZの設定をしていませんでした。
ユーザーズマニュアルにきちんと記されていますね。
実は、試食版だし・・・ということでよく調べでいませんでした。
なんだか、のどに刺さっていた骨が抜けた気分です。
ありがとうございました。
私が言うのもなんですが、ここは本当にためになります。