Используя strftime в C, как я могу отформатировать время точно как метка времени Unix?

Если вы не извлекаете архивы и не нуждаетесь в различиях, попробуйте опцию diff -q :

diff -q 1.tar 2.tar

Это тихий результат будет "1.tar 2.tar отличаются" или ничем, если нет различий.

9
задан kiritsuku 8 November 2012 в 18:52
поделиться

3 ответа

Я придумал следующее:

    char            fmt[64], buf[64];
    struct timeval  tv;
    struct tm       *tm;

    gettimeofday(&tv, NULL);
    if((tm = localtime(&tv.tv_sec)) != NULL)
    {
            strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u %z", tm);
            snprintf(buf, sizeof buf, fmt, tv.tv_usec);
            printf("'%s'\n", buf); 
    }

Исправления возникших у вас проблем:

  • Используйте gettimeofday ( ) и struct timeval , которая имеет член микросекунды для более высокой точности.
  • Используйте двухэтапный подход, когда мы сначала создаем строку, содержащую все данные, кроме микросекунд.
  • Используйте строчную букву «z» для смещения часового пояса. Похоже, это расширение GNU.

Я попытался заново создать смещение часового пояса вручную с помощью второго аргумента struct timezone * в gettimeofday () , но на моей машине это возвращает смещение 0, что неверно. На странице руководства для gettimefday () довольно много говорится об обработке часовых поясов в Linux (ОС, на которой я тестировал).

24
ответ дан 4 December 2019 в 08:15
поделиться

"% Y-% m-% d% T% z" , но похоже % z является расширением GNU.

1
ответ дан 4 December 2019 в 08:15
поделиться

% z (нижний регистр z).

Однако это не отображается в спецификации Posix . Google взял меня в круг , здесь .

1
ответ дан 4 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: