web-dev-qa-db-ja.com

st_mtime(stat関数から取得)をstringまたはcharに変換する方法

St_mtimeを文字列形式に変換してJavaレイヤーに渡す必要があります。この例を使用してみます http://www.cplusplus.com/forum/unices/10342/ しかし、コンパイラはエラーを生成します

'long unsigned int *'から 'const time_t * {aka long int const *}'への無効な変換

'tm * localtime(const time_t *)'の引数1を初期化しています[-fpermissive]

私が間違っていること、文字列表示でstat関数を使用してファイルの作成時間を取得する方法。

助けてください。

10
testCoder

stat(2) のマニュアルページによると、st_mtimeフィールドはtime_tです(つまり、 time(7) のマニュアルページを読んだ後、 nixエポック )からの秒数。

現地時間でそのtime_tstruct tmに変換するには localtime(3) が必要です。次に、 strftime(3) に変換するにはchar*文字列。

したがって、次のようにコーディングできます。

time_t t = mystat.st_mtime;
struct tm lt;
localtime_r(&t, &lt);
char timbuf[80];
strftime(timbuf, sizeof(timbuf), "%c", &lt);

次に、おそらくtimbuf-を使用してstrdupを使用します。

注意。スレッドに適しているため、localtime_rを使用しています。

14

strftime()を使用してください manページ に例があります:

struct tm *tm;
char buf[200];
/* convert time_t to broken-down time representation */
tm = localtime(&t);
/* format time days.month.year hour:minute:seconds */
strftime(buf, sizeof(buf), "%d.%m.%Y %H:%M:%S", tm);
printf("%s\n", buf);

出力を出力します:

"24.11.2012 17:04:33"
9
iabdalkader

別の方法でこれを達成できます。

  1. tm構造体へのポインターを宣言します。

    _struct tm *tm;
    _
  2. 適切なサイズの文字配列を宣言します。これには、必要な時間文字列を含めることができます。

    _char file_modified_time[100];
    _
  3. 関数localtime()を使用して、_st.st_mtime_(stはタイプstructstat、つまり_struct stat st_)を現地時間に分割します。

    _tm = localtime(&st.st_mtim);
    _

    注:_st_mtime_は、 stat(2) のマニュアルページにあるマクロ(_#define st_mtime st_mtim.tv_sec_)です。

  4. sprintf()を使用して、文字列形式または任意の形式で目的の時刻を取得します。

    _sprintf(file_modified_time, "%d_%d.%d.%d_%d:%d:%d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
    _

注意:使用する必要があります

_memset(file_modified_time, '\0', strlen(file_modified_time));
_

sprintf()の前に、マルチスレッドで発生するゴミのリスクを回避します。

2
Rohit