回答編集履歴

3

何で確認したか

2016/10/08 01:23

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
 
56
56
 
57
- ファイル名からであれば文字列を分解して日時(time_t)に変えて比べるぐらいでしょう。ちょっとサンプルを作ってみました。手元にVisual C++ 2003が無いため試していませんが、C++98一応動きましたので、たぶん、うまくいくでしょう。ファイル名のフォーマットチェックとか省いていますので、実際はそこら辺も追加してください。charではなくWCHARで扱いたい場合は、std::wstringとwtoiに変更してください。
57
+ ファイル名からであれば文字列を分解して日時(time_t)に変えて比べるぐらいでしょう。ちょっとサンプルを作ってみました。手元にVisual C++ 2003が無いため試していませんが、GCCで`-std=c++98`にして一応動きましたので、たぶん、うまくいくでしょう。ファイル名のフォーマットチェックとか省いていますので、実際はそこら辺も追加してください。charではなくWCHARで扱いたい場合は、std::wstringとwtoiに変更してください。
58
58
 
59
59
 
60
60
 

2

コメントへの追記

2016/10/08 01:23

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -45,3 +45,101 @@
45
45
 
46
46
 
47
47
  Visual Studio .NET 2003であっても、[_stat系](https://msdn.microsoft.com/ja-jp/library/ms350241(v=vs.71).aspx)は使えます。
48
+
49
+
50
+
51
+ ---
52
+
53
+ 【コメントへの追記】
54
+
55
+
56
+
57
+ ファイル名からであれば文字列を分解して日時(time_t)に変えて比べるぐらいでしょう。ちょっとサンプルを作ってみました。手元にVisual C++ 2003が無いため試していませんが、C++98で一応動きましたので、たぶん、うまくいくでしょう。ファイル名のフォーマットチェックとか省いていますので、実際はそこら辺も追加してください。charではなくWCHARで扱いたい場合は、std::wstringとwtoiに変更してください。
58
+
59
+
60
+
61
+ ```C++
62
+
63
+ #include <iostream>
64
+
65
+ #include <stdlib.h>
66
+
67
+ #include <string>
68
+
69
+ #include <time.h>
70
+
71
+
72
+
73
+ time_t getTimeFromFileName(std::string s);
74
+
75
+
76
+
77
+ int main()
78
+
79
+ {
80
+
81
+ // 現在日時
82
+
83
+ time_t now = time(NULL);
84
+
85
+
86
+
87
+ std::string filepath("C:\\Temp\\Test20161007100551.txt");
88
+
89
+ time_t name_time = getTimeFromFileName(filepath);
90
+
91
+
92
+
93
+ double diff_days = difftime(now, name_time) / (24 * 60 * 60);
94
+
95
+ std::cout << "file: " << filepath << std::endl
96
+
97
+ << "diff time (days): " << diff_days << std::endl;
98
+
99
+ return 0;
100
+
101
+ }
102
+
103
+
104
+
105
+ time_t getTimeFromFileName(std::string str)
106
+
107
+ {
108
+
109
+ // yyyyMMddHHMMss.txt であることが前提。
110
+
111
+ std::string time_str = str.substr(str.length() - 18, 14);
112
+
113
+
114
+
115
+ struct tm time = {.tm_sec = atoi(time_str.substr(12, 2).c_str()),
116
+
117
+ .tm_min = atoi(time_str.substr(10, 2).c_str()),
118
+
119
+ .tm_hour = atoi(time_str.substr(8, 2).c_str()),
120
+
121
+ .tm_mday = atoi(time_str.substr(6, 2).c_str()),
122
+
123
+ // tm_mon は1月から換算。
124
+
125
+ .tm_mon = atoi(time_str.substr(4, 2).c_str()) - 1,
126
+
127
+ // tm_year は1900年から換算。
128
+
129
+ .tm_year = atoi(time_str.substr(0, 4).c_str()) - 1900,
130
+
131
+ // tm_wday と tm_yday は mktime() で無視される。
132
+
133
+ .tm_wday = 0,
134
+
135
+ .tm_yday = 0,
136
+
137
+ // 夏時間フラグ、日本は夏時間が無いため 0 にする。
138
+
139
+ .tm_isdst = 0};
140
+
141
+ return mktime(&time);
142
+
143
+ }
144
+
145
+ ```

1

補足に対する追記

2016/10/08 01:21

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -35,3 +35,13 @@
35
35
 
36
36
 
37
37
  等と書いて、`stat`等を使うかでしょうか。
38
+
39
+
40
+
41
+ ---
42
+
43
+ 【補足への追記】
44
+
45
+
46
+
47
+ Visual Studio .NET 2003であっても、[_stat系](https://msdn.microsoft.com/ja-jp/library/ms350241(v=vs.71).aspx)は使えます。