形式で時間を印刷する方法:2009‐08‐10 18:17:54.811


回答:


107

strftime()を使用します。

#include <stdio.h>
#include <time.h>

int main()
{
    time_t timer;
    char buffer[26];
    struct tm* tm_info;

    timer = time(NULL);
    tm_info = localtime(&timer);

    strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
    puts(buffer);

    return 0;
}

ミリ秒の部分については、この質問をご覧ください。ANSI Cを使用してミリ秒単位で時間を測定する方法


これはさらに良い答えになり、ミリ秒部分の処理方法を調べるための小道具です。しかし、あなたのバッファは必要以上に少し長くなっていると思います。
ジャックケリー

14
短くするより長くする方がよい:-)
paxdiablo

素晴らしい答え。私はPHPであらゆる種類のことを行うことができましたが、それはすべてCにすでにあることを知っていました。ありがとう。
Vijay Kumar Kanta 2014年

1
おそらく、少なくともLinuxのtime(&timer)場合timer = time(NULL);、ラインはむしろになるはずです。 The tloc argument is obsolescent and should always be NULL in new code. When tloc is NULL, the call cannot fail.
AntoninDécimo2016年

5
localtime()が使用する「struct tm」は秒未満の時間情報を保持しないため、少なくとも1つのケース(Linux)では答えは間違いです。代わりに、gettimeofday()によって使用される「struct timeval」にはマイクロ秒があり、1000で割るとミリ秒になります。それらすべての賛成投票は本当に間違っており、誤解を招くものです!誰かがどのアーキテクチャーの下で「struct tm」を使用して秒以下の時間の詳細を取得するかを報告しない限り。
EnzoR 2017

30

上記の回答は、質問(具体的にはミリ秒の部分)に完全に答えるものではありません。これに対する私の解決策は、strftimeの前にgettimeofdayを使用することです。ミリ秒を「1000」に丸めないように注意してください。これはハミドナザリの答えに基づいています。

#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <math.h>

int main() {
  char buffer[26];
  int millisec;
  struct tm* tm_info;
  struct timeval tv;

  gettimeofday(&tv, NULL);

  millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec
  if (millisec>=1000) { // Allow for rounding up to nearest second
    millisec -=1000;
    tv.tv_sec++;
  }

  tm_info = localtime(&tv.tv_sec);

  strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", tm_info);
  printf("%s.%03d\n", buffer, millisec);

  return 0;
}

gettimeofdayはWindowsの実装では利用できません
Mendes

ビルド時に「-lm」オプションを追加してください。
スカイサイン、2016

3
私はそのバッファは、[24]が、その理由は以下のように十分にあると思う、YYYYは:MM:DD HH:MM:SS.mmm +は'\ 0'、24です
skysign

@メンデス、なぜWindowsに言及するのですか?問題は単純なC言語についてです。これらの間違った賛成投票にもかかわらず、これはより良い答えです(正しい答えではありません)。
EnzoR 2017

2
user3624334:いいえ、コードを理解できません。時間の要求は1つだけです。私はあなたが現地時間の呼び出しを意味していると思います-それは単にgettimeofdayからの出力を再フォーマットします。
クリス

12

time.h次のようなものを使用してstrftimeテキスト表現を提供できる関数を定義しますtime_t

#include <stdio.h>
#include <time.h>
int main (void) {
    char buff[100];
    time_t now = time (0);
    strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now));
    printf ("%s\n", buff);
    return 0;
}

ただし、からは利用できないため、1秒未満の解像度は得られませんtime_t。それは出力します:

2010-09-09 10:08:34.000

仕様に制約されていて、日と時間の間にスペースが必要ない場合は、フォーマット文字列から削除してください。


+1は、ミリ秒まで表示を埋めるための便利なトリックです。以前はそうしたいと思っていた顧客がいましたが、数字がゼロではないため、そこに重要性があるように見えました。私は彼からそれについて話しましたが、ゼロを入れることに同意しました。
RBerteig

4
私の友人(もちろん私ではありません)は、同じようなトリックを使用していました-彼らは最後の1秒と「ミリ秒」を含む静力学を維持しました。2番目が前回から変更されていない場合は、1〜200ミリ秒のランダムな値を追加しただけです(もちろん、999を超えないようにしてください。rand()の実際の最大値は常に最小値でした。 200と999までの距離の半分)。2番目が変更された場合、追加する前にミリ秒を0に設定しました。一見ランダムに見えるが、ミリ秒が適切にシーケンスされていて、顧客は賢明ではなかった:-)
paxdiablo

5

次のコードは、マイクロ秒の精度で印刷されます。私たちがしなければならないのは、使用されるgettimeofdayと、strftimetv_secとアペンドtv_usec構築文字列に。

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main(void) {
    struct timeval tmnow;
    struct tm *tm;
    char buf[30], usec_buf[6];
    gettimeofday(&tmnow, NULL);
    tm = localtime(&tmnow.tv_sec);
    strftime(buf,30,"%Y:%m:%dT%H:%M:%S", tm);
    strcat(buf,".");
    sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
    strcat(buf,usec_buf);
    printf("%s",buf);
    return 0;
}

2

を使用することもできますがstrftimestruct tm秒単位の解像度はありません。それがあなたの目的のために絶対に必要かどうかはわかりません。

struct tm tm;
/* Set tm to the correct time */
char s[20]; /* strlen("2009-08-10 18:17:54") + 1 */
strftime(s, 20, "%F %H:%M:%S", &tm);

2

騙す:

    int time_len = 0, n;
    struct tm *tm_info;
    struct timeval tv;

    gettimeofday(&tv, NULL);
    tm_info = localtime(&tv.tv_sec);
    time_len+=strftime(log_buff, sizeof log_buff, "%y%m%d %H:%M:%S", tm_info);
    time_len+=snprintf(log_buff+time_len,sizeof log_buff-time_len,".%03ld ",tv.tv_usec/1000);

1
これが機能する理由を詳しく説明してください。そして正確に何が起こっているのか。
Raj Kamal

上記の例とすべて同じですが、より効果的です。`time_len + = snprintf(log_buff + time_len、sizeof log_buff-time_len、" log var is =%s "、logvar); int ret = write(log_fd、log_buff、time_len); `
АндрейМельников

gettimeofdayはどこからインポートしますか?
AndreyP

1

このページの解決策はどれも私にとってはうまくいきませんでした、私はそれらを混同し、WindowsとVisual Studio 2019で動作させるようにしました、ここに方法です:

#include <Windows.h>
#include <time.h> 
#include <chrono>

static int gettimeofday(struct timeval* tp, struct timezone* tzp) {
    namespace sc = std::chrono;
    sc::system_clock::duration d = sc::system_clock::now().time_since_epoch();
    sc::seconds s = sc::duration_cast<sc::seconds>(d);
    tp->tv_sec = s.count();
    tp->tv_usec = sc::duration_cast<sc::microseconds>(d - s).count();
    return 0;
}

static char* getFormattedTime() {
    static char buffer[26];

    // For Miliseconds
    int millisec;
    struct tm* tm_info;
    struct timeval tv;

    // For Time
    time_t rawtime;
    struct tm* timeinfo;

    gettimeofday(&tv, NULL);

    millisec = lrint(tv.tv_usec / 1000.0);
    if (millisec >= 1000) 
    {
        millisec -= 1000;
        tv.tv_sec++;
    }

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", timeinfo);
    sprintf_s(buffer, 26, "%s.%03d", buffer, millisec);

    return buffer;
}

結果:

2020:08:02 06:41:59.107

2020:08:02 06:41:59.196

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.