• ベストアンサー

現在日時から、任意の時日時を求めるには

いつもお世話になっています。 いま、現在時刻を取得し、その日付からみて1日前のAM6時へ設定するという処理を作りたいのですが、思うようにできない状態です。 多分、"time(&timer)"で現在時刻を取得し、localtime関数で構造体へ変換してから、値を変更するのだと思うのですが、その部分の処理がうまくできません。 どうかアドバイスをよろしくお願いします。 #include<stdio.h> #include<time.h> void main(){ /* ----------- [ 変数の宣言 ]*/ int i; int sts; int res; time_t timer; time_t ans; struct tm *t_st; /* 現在時刻を取得 */ time( &timer ); t_st = localtime(&timer); t_st->tm_mday - 1; /* ←"コードは意味を持たない"という警告が発生*/ t_st->tm_hour = 6; timer = mktime(t_st); t_st = localtime(&timer); sprintf("%Y/%m/%d %H:%M", -- 以下略 -- }

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

こんな感じでしょうか? time_t timer = time(NULL); struct tm t = *localtime(&timer); t.tm_mday -= 1; t.tm_hour = 6; t.tm_min = 0; t.tm_sec = 0; mktime(&t);

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

t_st->tm_mday = t_st->tm_mday - 1; にすると意味を持ったコードにはなります。 ただ時間の設定というのがどういうことかわかりませんがスレッドセーフではない静的ポインタの内容を書き換えるのはお勧めできません。 (*sprintf( )の第1引数が変です。やりたいのは char s[256]; strftime(s, 256, "%Y/%m/%d %H:%M", t_st); では)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 現在時刻をyyyymmddhhmmss形式で変数に格納する

    いつもお世話になっております。 現在時刻を取得し、yyyymmddhhmmss形式で ひとつの変数に持たせたいとおもっているのですが 可能でしょうか? ---------- 1 #include <stdio.h> 2 #include <time.h> 3 4 int main(void) 5 { 6 struct tm *date; 7 time_t now; 8 int year; 9 int month; 10 int day; 11 int hour, minute, second; 12 13 /* 現在の日時を取得 */ 14 time(&now); 15 date = localtime(&now); 16 17 year = date->tm_year + 1900; 18 month = date->tm_mon + 1; 19 day = date->tm_mday; 20 hour = date->tm_hour; 21 minute = date->tm_min; 22 second = date->tm_sec; 23 24 return 0; 25 26 } 27 --------------- yearからsecondを結合してひとつの変数に格納することは可能でしょうか??

  • 現在時刻をミリ秒まで取得

    お疲れ様です 現在時刻をミリ秒まで取得がしたいです。 今はtime_tを使って秒までは取得したのですがミリ秒は構造体にないらしく同じようにとってはこれないのでしょうか? また別のやり方だとどんなのがあるか教えてください。 現在は下記のように取得してyyyymmddhhmmssの形を作ってます。 これをyyyymmddhhmmsssssのようにミリ秒を増やしたたいのです。 長くなってしまいましたがよろしくお願いします time_t timer; time(&timer);/* 現在の時刻を取得 */ struct tm *local; local =localtime(&timer);/* 地方時の構造体に変換 */ CString time; //CString用の時間 time.Format("%4d%02d%02d%02d%02d%02d" ,local->tm_year + 1900,/* 年 */ local->tm_mon+1,/*月は0から始まるので1を+*/ local->tm_mday,/* 日 */ local->tm_hour,/* 時 */ local->tm_min,/* 分 */ local->tm_sec);/* 秒 */

  • ユニックス時間(秒)を普通の日付時間(時:分:秒)に直すにはどうすればいいでしょうか。

    こんにちわ。質問させて頂きます。 C言語で、pcap.hによってキャプチャされたパケットのタイムスタンプ(秒)を、標準時間と申しますか、時:分:秒に直したいと考えています。 時間変換の関数で、ctime,asctime,localtime等があるのは分かっているので、localtime関数を使おうと思っているのですが、使ってみたところポインタのタイプが違うのでエラーが出てしまいます。 具体的には、 方法(1):time_t変数に代入してやってみる struct tm *t_st; time_t timer; timer = header->ts; t_st = localtime (&timer); 方法(2):localtime関数に直接放り込む t_st = localtime (&header->ts); 等を試してみたのですが当然アウトでした。 パケットヘッダの中の時間を表すheader->tsをどうにかlocaltime関数で使いたいと考えています。 これを解決する良い方法はあるでしょうか。 ご存知であればご教授いただけないでしょうか。どうぞよろしくお願いします。

  • 【C言語プログラミング】 time()関数について

    現在の時刻を表示させるプログラムをC言語で作成したいのですが、 書籍などを参考に以下のコーディングを行いました。 #include <stdio.h> #include <time.h> int main(void) { time_t timer; /* 現在の時刻を取得する */ timer = time(&timer); /* 現在の時刻を出力する */ printf("現在の時刻: "); printf("%s", ctime(&timer)); printf("です。\n"); return 0; } 質問内容は以下の通りです。 (1)「time_t timer;」とは、time_t型の変数timerを宣言し、   この変数にはtime()関数で取得した現在時刻の値が入る? (2)「timer = time(&timer);」に関して、time()関数で取得した値   を変数timerが指すアドレスの場所に入れる? その場合、   返り値を格納する変数timerに、time()関数の引数と同じtimerが   指定されているのはなぜ? (3)プログラムを実行すると以下の結果となる。(time.exeを実行)   C:\>time   現在の時刻: 12:52:07.61   新しい時刻を入力してください:   現在の時刻を表示した直後に「新しい時刻を入力して下さい」が   表示される。これはtime()関数の仕様どおり? 以上です。初歩的な質問で申し訳ございませんが、ご回答よろしく お願いいたします。

  • 一日(0時0分0秒)おきに表示される文字列を変える

    一日(0時0分0秒)おきに表示される文字列を変えたいのですが、time関数を使って一日(0時0分0秒)の判定がうまくいきません ---以下ソース--- #include <stdio.h> #include <time.h> void *main(void){ time_t timer; struct tm *t_st; int i; char *set[20] ={"お帰り", "帰ってきたな", "どこ行ってたの?プンプン", //---残りは省略します--- }; time(&timer); i=((timer-54000)/86400)%20; //-54000は誤差修正のつもり printf("%s", set[i]); } ---ソースここまで--- 一日(0時0分0秒)の判定がちゃんとされるにはどうしたらいいのでしょうか? localtime関数を使って何日や1月1日から何日経過したかを調べて判定を変えるというのは無しです。 その場合は一ヶ月や一年ごとに初期値に戻されるので。

  • C言語の出力方法

    #include <stdio.h> #include <time.h> #include <Windows.h> int main(void) { time_t timer; struct tm *t_st; while(1){ time(&timer); printf("現在時刻: %s\n", ctime(&timer)); sleep(1); } return 0; } と言うプログラムで、コマンドプロンプトに現在時刻を表示させています。 実行すると C:\>zikoku 現在時刻: Tue Oct 27 23:08:19 2009 現在時刻: Tue Oct 27 23:08:20 2009 現在時刻: Tue Oct 27 23:08:21 2009 現在時刻: Tue Oct 27 23:08:22 2009 現在時刻: Tue Oct 27 23:08:23 2009 現在時刻: Tue Oct 27 23:08:24 2009 という感じでどんどん下に表示されていきますが、 C:\>zikoku 現在時刻: Tue Oct 27 23:08:19 2009 と1行だけ表示させ、この1行を毎回書き換える という事は出来ないのでしょうか? C:\>zikoku 現在時刻: Tue Oct 27 23:08:19 2009 の1秒後 C:\>zikoku 現在時刻: Tue Oct 27 23:08:20 2009 と言う風に、下に表示ではなく、元々表示されている場所に再度と言うことです。

  • newとdeleteでのアサート

    C++とViasulC++2003にて、 現在時刻を取得する関数を作成しているのですが、 以下のようなアサートが表示され強制終了してしまいます。 > _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) おそらくnewとdeleteあたりで発生しているのは確かなのですが、 その原因が解らずにこまっています。 どうか、アドバイスをよろしくお願いします。 プログラムのソースは以下の通りです。 #include <time.h> void get_date( int *year, int *mon, int *day, int *week ){ tm *mytime = new tm(); time_t long_time; time( &long_time ); mytime = localtime( &long_time ); *year = mytime->tm_year + 1900; *mon = mytime->tm_mon + 1; *day = mytime->tm_mday; *week = mytime->tm_wday; delete mytime; mytime = NULL; } int main(){ int y, m, d, w; get_date( &y, &m, &d, &w ); }

  • いつもお世話になっております。以下のようなプログラムで現在時刻の表示を

    いつもお世話になっております。以下のようなプログラムで現在時刻の表示をしているわけですが、 #include <stdio.h> #include <time.h> int main(void) { //日付 time_t tmp; struct tm date; time(&tmp); date = *(localtime(&tmp)); printf("現在の時刻:%d-%d-%d %d:%d\n", date.tm_year + 1900 , date.tm_mon + 1 , date.tm_mday , date.tm_hour , date.tm_min); return 0; } このプログラムで動いているので問題は無いのですが、 例えば月・日・時・分が1桁の場合に出力画面が「2010-5-20 14:7」となってしまいます。 個人的には「2010-05-20 14:07」とYYYY-MM-DD HH:MM←(この書き方であってるか不安…) 方式にしたいのですがどのようにすれば良いでしょうか?

  • 時刻取得について

    C言語において時刻取得を以下のようにプログラムしたら、プログラムを3回目以上実行すると前回時間内容が常に1回目が表示されてしまいます。どこを直せばちゃんと前回の時刻が正しく表示されるようになるのでしょうか。put()のfopenの"a"の部分は"w"に変えるだけで正しく実行されるのですが、これを"a"にした場合について正しく表示されるようにするということです。 #include <time.h> #include <stdio.h> void get(void); void put(void); char data_file[] = "time.dat"; int main(void) { get(); put(); return(0); } /* 前回の日付・時刻を読込む   */ void get(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); if ((fp = fopen(data_file, "r")) == NULL){ printf("\a本プログラムを実行するのは初めて\n"); }else { int year, month, day, h, m, s; fscanf(fp, "%d %d %d", &h, &m, &s); printf("前回は%d時%d分%d秒\n", h, m, s); fclose(fp); } } /* 今回の日付・時刻を書き込む   */ void put(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); if ((fp = fopen(data_file, "a")) == NULL) printf("\aファイルをオープンできません。\n"); else { printf("現在の日付・時刻を書き出しました。\n"); fprintf(fp, "%d %d %d\n", local->tm_hour, local->tm_min, local->tm_sec ); fclose(fp); } }

  • プログラムの実行を中断

    標準ライブラリにプログラムを指定した時間だけ停止する、というような関数はあるでしょうか? 自分でも似たような関数を作ったのですが、負荷が大きいらしく動作が指定した時間よりも遅れてしまうことがあります。 #include <ctime> void sleep(int time) { tm *present; time_t clock; int begin; time(&clock); present=localtime(&clock); begin=present->tm_sec while(begin!=present->tm_sec-time){ time(&clock); present=localtime(&clock); } return; }

このQ&Aのポイント
  • ブラザー製品のDCP-J981Nで、インクが検知されないトラブルが発生しています。正しい型番とはめかたにしているにもかかわらず、インクが検知されないエラーメッセージが表示されます。このトラブルの解決方法について教えてください。
  • DCP-J981Nのインクが検知されないトラブルについて相談です。インクの型番とはめかたは間違っていないのに、なぜかインクが検知されずエラーメッセージが表示されます。この問題を解決する方法を教えてください。
  • DCP-J981Nのインクが検知されないトラブルについての相談です。正しい型番とはめかたにしているのに、なぜかインクが検知されないと表示されます。この問題の解決策を教えてください。
回答を見る

専門家に質問してみよう