Как распечатать время в формате: 2009-08-10 18: 17: 54.811

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

Ответ 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;
}