9

これが私が求めている時間のフォーマットの種類です:

2009-10-08 04:31:33.918700000 -0500

私は現在これを使用しています:

strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", ts);

これにより、次のことが得られます。

2009-10-11 13:42:57 CDT

これは近いですが、正確ではありません。-0500最後に表示するものは何も見つからないようです。さらに、秒をintとして取得しています。

この 2 つの問題を解決するにはどうすればよいですか?

4

3 に答える 3

24

私はこれを思いつきました:

    char            fmt[64], buf[64];
    struct timeval  tv;
    struct tm       *tm;

    gettimeofday(&tv, NULL);
    if((tm = localtime(&tv.tv_sec)) != NULL)
    {
            strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u %z", tm);
            snprintf(buf, sizeof buf, fmt, tv.tv_usec);
            printf("'%s'\n", buf); 
    }

発生した問題の修正:

  • gettimeofday()、およびstruct timeval、より高い精度のためにマイクロ秒メンバーを持つ を使用します。
  • マイクロ秒を除くすべてのデータを含む文字列を最初に作成する 2 段階のアプローチを使用します。
  • タイムゾーン オフセットには小文字の「z」を使用します。これは GNU 拡張のようです。

struct timezone *の 2 番目の引数を使用して、タイムゾーン オフセットを手動で再作成しようとしましたgettimeofday()が、私のマシンでは正しくない 0 のオフセットが返されます。のマニュアル ページgettimefday()は、Linux (私がテストした OS) でのタイムゾーンの処理について多くのことが書かれています。

于 2009-10-11T20:12:15.320 に答える
1

%z (小文字の z)。

ただし、これはPosix 仕様には記載されていません。Google は私をここに連れ戻してくれました。

于 2009-10-11T20:06:33.957 に答える
1

"%Y-%m-%d %T %z"、しかしそれ%zはGNU拡張のようです。

于 2009-10-11T20:07:10.100 に答える