11

st_mtimeをJavaレイヤーに渡すために文字列形式に変換する必要があります。この例を使用しようとしていますが、 http: //www.cplusplus.com/forum/unices/10342/コンパイラーでエラーが発生し ます。

'long unsignedint*'から'consttime_t * {aka long intconst*}'への無効な変換

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

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

助けてください。

4

3 に答える 3

16

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

これを現地時間でに変換するにはlocaltime(3)が必要であり、次に文字列に変換するにはstrftime(3)が必要です。time_tstruct tmchar*

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

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

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

NB。localtime_rスレッドにやさしいので使っています。

于 2012-11-24T15:01:00.583 に答える
9

マニュアルページに次のようなstrftime()例があります。

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"
于 2012-11-24T15:00:10.070 に答える
2

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

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

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

    char file_modified_time[100];
    
  3. 次の関数を使用して、st.st_mtimeststructタイプstatの、つまりstruct stat st)を現地時間に分割しますlocaltime()

    tm = localtime(&st.st_mtim);
    

    注:stat(2)のマニュアルページにst_mtimeあるマクロ( )です。#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()マルチスレッドで発生するゴミのリスクを回避する前に。

于 2014-07-23T06:49:51.967 に答える