Как я могу исправить свою функцию для печати времени, чтобы не было 8 часов медленно? - PullRequest
1 голос
/ 30 июня 2019

Это тест для моей библиотеки C, которую я создал, которая печатает часы, минуты и секунды дня:

#include <time.h>
#include <stdio.h>

time_t print_time(time_t t)
{
    if(!t) t = time(NULL);
    printf("%d:%.2d.%.2d\n", (t % (60*60*60))/(60*60), (t % (60*60))/60, t % 60);
    fflush(stdout);
    return t;
}

int main(void)
{
    print_time(0);
}

Это был 10: 56.42, где я был, когда я впервые запустил эту программу, но функция print_time напечатала 2: 56.42.Как это исправить?

Я пытался вычесть (t % (60*60*60))/(60*60) из 12 и распечатать это, и он печатает правильное время, но когда время изменилось на 11, время печатается как 9.

1 Ответ

6 голосов
/ 30 июня 2019

60*60*60 означает 60 часов, а не день. Вы хотите что-то вроде:

printf("%d:%.2d.%.2d\n", (t % (24*60*60))/(60*60), (t % (60*60))/60, t % 60);

Здесь, во Франции, эта программа печатает правильное время минус 2 часа (без учета летнего времени (+1), добавленного к UTC (+1 тоже)).

Я предлагаю вместо этого использовать стандартные библиотечные функции, такие как localtime или gmtime.

time_t t = time(NULL);
struct tm *tstruct = gmtime(&t);

сейчас tstruct указывает на информацию, день, час, вы называете это ...

struct tm {
   int tm_sec;         /* seconds,  range 0 to 59          */
   int tm_min;         /* minutes, range 0 to 59           */
   int tm_hour;        /* hours, range 0 to 23             */
   int tm_mday;        /* day of the month, range 1 to 31  */
   int tm_mon;         /* month, range 0 to 11             */
   int tm_year;        /* The number of years since 1900   */
   int tm_wday;        /* day of the week, range 0 to 6    */
   int tm_yday;        /* day in the year, range 0 to 365  */
   int tm_isdst;       /* daylight saving time             */   
};

Полный пример с вашим методом и методами local & gm:

#include <time.h>
#include <stdio.h>

int main()
{
    time_t t = time(NULL);
    printf("%d:%.2d.%.2d\n", (t % (24*60*60))/(60*60), (t % (60*60))/60, t % 60);
    struct tm *tstruct = gmtime(&t);
    printf("%d:%.2d.%.2d\n",tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec);
    tstruct = localtime(&t);
    printf("%d:%.2d.%.2d\n",tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec);
}

печать:

15:22.26
15:22.26
17:22.26

Похоже, ваш код теперь может правильно эмулировать часы с UTC. Теперь больше проблем с високосными годами и все ...

Если вы не можете использовать стандартные библиотеки (кроме time()) и хотите местное время, вам также придется обрабатывать часовой пояс. Вам придется жестко закодировать это в некоторых пользовательских настройках (как в операционной системе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...