2009‐08‐10
18:17:54.811
の形式でCで時間を出力する最良の方法は何ですか?
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を使用してミリ秒単位で時間を測定する方法?
上記の回答では、質問(具体的にはミリ秒の部分)に完全には答えません。これに対する私の解決策は、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;
}
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
仕様に本当に制約されており、日と時間の間にスペースが必要ない場合は、フォーマット文字列から削除してください。
次のコードはマイクロ秒の精度で印刷されます。必要なことは、tv_sec
でgettimeofday
とstrftime
を使用し、構築された文字列に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;
}
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);