C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 文字列←→time_t


(過去ログ 130 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■77068 / inTopicNo.1)  文字列←→time_t
  
□投稿者/ こまお (5回)-(2015/09/09(Wed) 11:29:51)

分類:[C/C++] 

こんにちは、time_tと文字列の相互変換にトライ中です。
windowsでは下の様な感じで一応うまくいっているのですが、
windows以外でもうまくいくか心配です。
識者のアドバイスをいただきたく。
よろしくおねがいします。

std::string timeToStr(time_t time) {
 char s[100];
 struct tm *timep;
 timep = localtime(&time);
 strftime(s, NELEMS(s), "%Y/%m/%d %H:%M:%S", timep);
 return s;
}

time_t strToTime(std::string str) {
 int year, month, day, hour, minute, second;
 sscanf(str.c_str(), "%d/%d/%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);

 struct tm time;
 time.tm_sec = second;
 time.tm_min = minute;
 time.tm_hour = hour;
 time.tm_mday = day;
 time.tm_mon = month - 1;
 time.tm_year = year - 1900;
 time.tm_isdst = 0;

 return mktime(&time);
}

void main(void) {
 time_t now = time(0);
 time_t last = ini.readTime(timeToStr(now));
 std::cout << ((now == last)?("same"):("not same")) << std::endl; //"same"
}

引用返信 編集キー/
■77069 / inTopicNo.2)  Re[1]: 文字列←→time_t
□投稿者/ こまお (6回)-(2015/09/09(Wed) 12:02:16)
あ、2行目まちがえてました。

void main(void) {
 time_t now = time(0);
 time_t last = strToTime(timeToStr(now));
 std::cout << ((now == last)?("same"):("not same")) << std::endl; //"same"
}

引用返信 編集キー/
■77072 / inTopicNo.3)  Re[2]: 文字列←→time_t
□投稿者/ 774RR (308回)-(2015/09/09(Wed) 12:21:47)
ここで使っている localtime や strftime は C 言語規格書における標準関数なので
(正しく使っていれば) Windows だけでなくて UNIX でも問題なく動く。
で、提示ソースは問題あるように見えないので動くはずだよ。
ウチの HPUX でも動いた。

以下オフトピ

いわゆる [間違い] は無いんだけど char [] と std::string が混在してるのがちょっとだけ惜しい感じ。
でもぢゃあどう直すか・・・となると C++1998 の範囲では難しいかなぁ。
こんなときは boost に頼れということで
http://www.boost.org/doc/libs/1_59_0/doc/html/date_time.html

引用返信 編集キー/
■77074 / inTopicNo.4)  Re[3]: 文字列←→time_t
□投稿者/ こまお (7回)-(2015/09/09(Wed) 13:41:14)
ありがとうございます。
2つを比較すると
strftime()に対応するのがsscanf()で
localtime()に対応するのが構造体書き込みなのですが、
localtime()ってそれしかしてないの?
"local"ってだけに、他になんかしてるんじゃないの?
みたいなのがひっかかっています。

引用返信 編集キー/
■77075 / inTopicNo.5)  Re[4]: 文字列←→time_t
□投稿者/ こまお (8回)-(2015/09/09(Wed) 15:02:42)
あー!なんとなく判った気が。
struct tmにはそもそもlocaltimeしか入らないので、
だからmktime()はそれを前提に標準時を計算する。
そういうことでいいのかしら!?

引用返信 編集キー/
■77076 / inTopicNo.6)  Re[5]: 文字列←→time_t
□投稿者/ 774RR (309回)-(2015/09/09(Wed) 15:21:10)
2015/09/09(Wed) 15:46:10 編集(投稿者)

だいたいそういうことです。

struct tm に格納されている「人間に可読な年月日、時刻」は現地時間
mktime は「経過秒」を計算する際に現地時間の時差・夏時間を考慮に入れる

mktime はもっと面白い使い方ができて

today->tm_mday+=3; // 今日から三日後、を求めたい
t=mktime(today);
theday=localtime(t); // 三日後が得られる
9月9日の三日後は9月12日だけど9月29日の3日後は10月2日、が上記コードで得られる

編集: typo 修正
引用返信 編集キー/
■77078 / inTopicNo.7)  Re[6]: 文字列←→time_t
□投稿者/ こまお (9回)-(2015/09/09(Wed) 15:41:39)
そんな使い方もあるんですね。
てっきりエラーになると思ってました (^^;

これで安心して使えます。
ありがとうございました!
解決済み
引用返信 編集キー/
■77106 / inTopicNo.8)  Re[6]: 文字列←→time_t
□投稿者/ yoh2 (11回)-(2015/09/12(Sat) 14:20:25)
ちょっと補足です。

> today->tm_mday+=3; // 今日から三日後、を求めたい
> t=mktime(today);
> theday=localtime(t); // 三日後が得られる

mktime() を呼び出した時点で引数の内容が補正されますので、
補正された struct tm の内容が欲しいだけなら、3つめの
localtime() 呼出は不要だったりします。
同じ理由により、todayを変更したくない場合は、mktime() の
引数には、todayをコピーした別の変数を渡す必要があるので注意。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -