Какой лучший способ распечатать время на C в формате 2009‐08‐10
18:17:54.811
?
Как распечатать время в формате: 2009-08-10 18: 17: 54.811
Ответ 1
Используйте 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?
Ответ 2
Вышеупомянутые ответы не полностью отвечают на вопрос (в частности, часть миллисекунда). Моим решением для этого является использование gettimeofday до strftime. Обратите внимание на осторожность, чтобы избежать округления миллисекукса до "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;
}
Ответ 3
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;
}
но это не даст вам второстепенных резолюций, поскольку это невозможно для time_t
. Он выводит:
2010-09-09 10:08:34.000
Если вы действительно ограничены спецификациями и не хотите пространства между днем и часом, просто удалите его из строки формата.
Ответ 4
Вы можете использовать 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);
Ответ 5
После печати кода с точностью до микросекунды. Все, что нам нужно сделать, это использовать gettimeofday
и strftime
на tv_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;
}