Парень просит самый простой способ. Все ваши пути излишне сложны. Просто используйте модульную арифметику:
#include <stdio.h>
#include <time.h>
#define TARGET_TIME 21*60 // 9:00 PM, in format HH * 60 + MM
int main(int argc, char* argv[])
{
struct tm* tm;
time_t ts = time(NULL);
int minutes_until_9pm;
tm = localtime(&ts);
minutes_until_9pm = 24*60 - (tm->tm_min + tm->tm_hour * 60 + TARGET_TIME)%(24*60);
//alternatively, the following is slightly faster
//minutes_until_9pm = 24*60 - (tm->tm_min + tm->tm_hour * 60 + TARGET_TIME) + (tm->tm_min+tm->tm_hour*60+TARGET_TIME>24*60?24*60:0);
printf("%d minutes til (next)9pm\n", minutes_until_9pm);
return 0;
}
Если вы знаете свой часовой пояс, все становится еще проще:
#include <stdio.h>
#include <time.h>
#define TARGET_TIME 21*60 // 9:00 PM, in format HH * 60 + MM
#define TIMEZONE (-6) // This is CST; replace with your own timezone
int main(int argc, char* argv[])
{
int minutes_until_9pm = 24*60 - (time(NULL)/60 + TARGET_TIME + (24+TIMEZONE)*60)%(24*60);
printf("%d minutes til (next)9pm\n", minutes_until_9pm);
return 0;
}
Что здесь происходит, так это то, что по модулю один день мы получаем количество минут с полуночи. Затем мы добавляем 9:00 вечера, чтобы получить количество минут с 9:00 вечера. Затем мы вычитаем это из 24 часов, чтобы получить количество минут до следующих 9:00 вечера.
Если вам нужна более высокая точность (то есть, округленная до ближайшего числа минут, а не просто числа минут), просто вычтите (tm->tm_sec>=30?0:1)
из minutes_until_9pm
или замените time(NULL)/60
на (time(NULL)+30)/60
соответственно. *