Как напечатать время в формате: 2009‐08‐10 18: 17: 54.811 - PullRequest
79 голосов
/ 09 сентября 2010

Какой лучший способ распечатать время в C в формате 2009‐08‐10 
18:17:54.811?

Ответы [ 5 ]

93 голосов
/ 09 сентября 2010

Используйте 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?

24 голосов
/ 07 октября 2015

Приведенные выше ответы не полностью отвечают на вопрос (в частности, миллисекундная часть). Мое решение этого заключается в использовании 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;
}
9 голосов
/ 09 сентября 2010

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

Если вы действительно ограничены спецификациями и не хотите пробела между днем ​​и часом, просто удалите его из строки формата.

3 голосов
/ 06 июня 2016

Следующий код печатается с точностью до микросекунды.Все, что нам нужно сделать, это использовать 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;
}
2 голосов
/ 09 сентября 2010

Вы можете использовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...