Как сделать флажки часового, минутного смещения в программировании на C

Я использую C на Unix. Программа отображает время, и я пытаюсь выяснить, как сместить текущее время в минутах и ​​часах.

Эта часть кода

  while ( ( let = getopt(argc, argv, "alo:vh")) != -1 ) {
    switch (let) {
    case 'o':  offset = atoi(optarg);  break; }

и позже в этой части:

void clock(int sig, int time_expires)
{
time_t       now;
struct tm   *dateinfo; 

(void) time(&now);
now = now + offset;

dateinfo = localtime( &now ); }

Создает смещение -o, которое смещает текущее время на определенное количество секунд. Например, -o590 сместит текущее время на 590 секунд.

Я пытаюсь выяснить, как сделать то же самое, только с помощью флага -h, который смещает время на определенное количество часов (например, -h6 смещает время на 6 часов), или с помощью флага -m, который смещает время на минут.

Я попытался разделить текущий флаг -o на 60 или 360, но это не работает. Кто-нибудь может указать мне правильные направления здесь?

2 ответа

Изменить time_t на столько часов, минут, секунд в портативном режиме, не полагаясь на time_t некоторый целочисленный тип секунд с 1970 года, используйте mktime()

time_t adjust(time_t t, int hour, int minute, int second) {
  struct tm *dateinfo; 
  dateinfo = localtime(&t);
  if (dateinfo == NULL) return (time_t) -1;
  dateinfo->tm_hour += hour;
  dateinfo->tm_min += minute;
  dateinfo->tm_sec += second;
  return mktime(dateinfo);
}

time_t структура определяет количество секунд с 1 января 1970 года по Гринвичу.

Если вы хотите добавить n минут, вы должны сделать:

now+= n*60

И в течение n часов вы должны:

now+= n*3600

В качестве альтернативы вы можете использовать struct tm и получить доступ непосредственно к временным квантам, которые вы хотите изменить.

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             */
};
Другие вопросы по тегам