• 締切済み

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

こんにちわ。質問させて頂きます。 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関数で使いたいと考えています。 これを解決する良い方法はあるでしょうか。 ご存知であればご教授いただけないでしょうか。どうぞよろしくお願いします。

みんなの回答

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.2

time_t timer; timer = header->ts; t_st = localtime (&timer); これでok t_st->tm_mday に日付が入ってます 駄目だったとしたらこの部分か timer = header->ts; パケットから持ってきたままだと ASCIIの可能性も

arlstumia
質問者

お礼

ご回答有難う御座いました。 timer = header->ts.t_sec とすると嘘のようにすんなり行くことが出来ました。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

こういう質問をする場合、headerの型がなんであるかを示してください。 今回はどうやらstruct pcap_pkthdrらしいという推測はつきますが。 で、header->tsの型はstruct timevalでlocaltimeが引数に要求するのはconst time_t *なので当然このままでは入れられません。 struct timevalの定義を見ればどうすればいいかの答えはわかるはずです。

関連するQ&A

  • 一日(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日から何日経過したかを調べて判定を変えるというのは無しです。 その場合は一ヶ月や一年ごとに初期値に戻されるので。

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

    いつもお世話になっています。 いま、現在時刻を取得し、その日付からみて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", -- 以下略 -- }

  • localtimeについて

    C言語のlocaltimeについて質問です。 ファイルから通算秒の値を読み込み、それを構造体2次元配列に格納し、locatime関数で日付を計算したいんです。 しかし、うまく変換できていないようで想定していない日付になってしまいます。 例えば typedef struct TIME { time_t time; } TIME; struct tm *s; long time1; ←ファイルから読み込んだ通算秒が格納されている TIME t[5][10]; for(i=0; i<5;i++) { for(j=0;j<10;j++) { t[i][j].time = time1; s = localtime(&t[i][j].time); /* (1) */ printf("時 : %d\n",s->tm_hour); printf("分 : %d\n",s->tm_min); } } printfで時間と分を出力すると時間が11時間ほどずれています。 (1)があやしいと思うのですが、間違いがわからないので、どうかご教授ください!

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

    お疲れ様です 現在時刻をミリ秒まで取得がしたいです。 今は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);/* 秒 */

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

    標準ライブラリにプログラムを指定した時間だけ停止する、というような関数はあるでしょうか? 自分でも似たような関数を作ったのですが、負荷が大きいらしく動作が指定した時間よりも遅れてしまうことがあります。 #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; }

  • localtime() 関数についての質問

    C言語の勉強をして間もない者です。 time_t = current; struct tm = *local; time(&current); local = localtime(&current); こんなのがlocaltime関数を使った一般的なプログラムだと思いますが、なぜlocaltimeの引数がcurrentのポインタなのでしょうか? 別にcurrentには値を代入しないのだから、localtime(current)でもいいとおもうのですが、ポインタにした必然的理由があるのでしょうか?

  • FLASH時間処理のミリ秒の除去と時、分の表示のさせ方。

    flash内のあるボタンが押された時から時間を計測するということをしたいのですが、(イメージ的には携帯で通話しているときに表示される通話時間です。) http://oshiete1.goo.ne.jp/qa2684689.htmlのページの _root.timer.text = Math.floor((getTimer()-time1)/1000)+"."+("00"+(getTimer()-time1)).substr(-3, 3); では、ミリ秒と秒のみの表示になっておりミリ秒を除いた時、分、秒のみの表示がしたいのですが、60秒を超えてしまったり、分が0のままにんなってしまったりミリ秒が被ってしまったりと Math.floor((getTimer()-time1)/1000/60/60)+":"+((getTimer()-time1)/1000/60)+"."+("00"+(getTimer()-time1).substr(-3, 3); などいろいろ試してみたのですができません、根本的に間違っているのでしょうか? substr(-3, 3) と記述など何のためにあるのかもわからない初心者ですが、どなたかご教授していただけませんでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 【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()関数の仕様どおり? 以上です。初歩的な質問で申し訳ございませんが、ご回答よろしく お願いいたします。

  • 残り時間カウントダウン表示 『あと○時間△分□秒』

    CGIゲーム内であるイベントが発生してから12時間後に新イベントが自動発生するスクリプトを作りたいのですが ネット検索をしても残り日数表示しかなくてサンプルがないので創ってみたのですが <body onLoad="count()" onUnload="clearTimeout()"> $ENV{'TZ'} = "JST-9"; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); <=現在の時間 $date="0,0,11,3,0,107,0,27,0 485,197,854,"; <=保存されたプレイベント発生時間 foreach($date){ ($sc,$mi,$ho,$md,$mo,$ye,$wd,$yd,$isd)=split(/,/); } print <<"EOM"; <SCRIPT language="JavaScript"> <!-- cnt = $sc-$sec; cnt1=$mi-$min; if($ho>$hour){cnt2=$ho-$hour-12;} else{cnt2=$ho-$hour+12;} if(cnt2>12){cnt2=cnt2-12;} if(cnt<0){cnt=cnt+59; cnt1=cnt1-1;} if(cnt1<0){cnt1=cnt1+59; cnt2=cnt2-1;} if(cnt2<0){cnt=0;cnt1=0;cnt2=0;} function count(){ document.form.box.value = cnt2+"時間"+cnt1+"分"+cnt+"秒"; cnt--; if(cnt<0){cnt=cnt+60; cnt1=cnt1-1;} if(cnt1<0){cnt1=cnt1+60; cnt2=cnt2-1;} if(cnt2<0){cnt=0;cnt1=0;cnt2=0;} if(cnt2 >=0) { if(cnt1 >=0) { if(cnt >=0) { setTimeout("count()",1000); }}} } //--> </SCRIPT> <FORM name="form"> あと<INPUT type="text" name="box" size="17">です </FORM> EOM とりあえず表示はできた(と思う)のですがもっと楽で確実な方法はありますでしょうか?(モジュールとかは使わずに) または上記のスクリプトすぐに思いつかなかったのでtime()で計算してたのですが 『残り53495秒』(適当)のような表記方法しか分かりません これを○時間△分□秒のように変換してカウントダウンできるでしょうか? localtime()、time()どちらでもいいのでご意見お願いします

  • ファイル情報の「月」の値を整数値で取得するには?

    こんにちは。私は30代の男性です。 下記のサイトに載っていたコーディングなのですが、 http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide93-1.html 「ctime(&filestat.st_mtime)」で取得した「Sat Apr 5」の「月」の値を整数で取得する方法を 考えています(例えば、「Sat 4 5」という感じで)。 何かいい方法はないでしょうか?アドバイスを頂けるとありがたいです。 よろしくお願いします。 #include <sys/types.h> /* stat(), struct stat */ #include <sys/stat.h> /* stat(), struct stat */ #include <stdio.h> /* fprintf(), printf() */ #include <errno.h> /* errno */ #include <string.h> /* strerror() */ #include <stdlib.h> /* exit() */ #include <time.h> /* time_t, ctime() */ int main(void) { struct stat filestat; char path[] = "/path/to/file"; time_t dtime; if(stat(path, &filestat) == -1) { fprintf(stderr, "* Error (%d) [stat: %s]\n", errno, strerror(errno)); exit(errno); } printf("Size: %ld\n", (long)filestat.st_size); printf("Last accessed: %ld, %s", filestat.st_atime, ctime(&filestat.st_atime)); printf("Last modified: %ld, %s", filestat.st_mtime, ctime(&filestat.st_mtime)); dtime = filestat.st_atime - filestat.st_mtime; printf("%ld\n", dtime); exit(0); } 実行例です。 Size: 86555 Last accessed: 1049485323, Sat Apr 5 04:42:03 2003 Last modified: 1049428803, Fri Apr 4 13:00:03 2003 56520