web-dev-qa-db-ja.com

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

2009‐08‐10 
18:17:54.811の形式でCで時間を出力する最良の方法は何ですか?

81

strftime() を使用します。

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

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

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

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

    return 0;
}

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

94
Hamid Nazari

上記の回答では、質問(具体的にはミリ秒の部分)に完全には答えません。これに対する私の解決策は、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;
}
24
Chris

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

#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;
}

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

2010-09-09 10:08:34.000

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

9
paxdiablo

次のコードはマイクロ秒の精度で印刷されます。必要なことは、tv_secgettimeofdaystrftimeを使用し、構築された文字列に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;
}
4
Nataraj

strftimeを使用できますが、struct 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
Jack Kelly