demandant la façon la plus simple Le gars. Toutes vos manières sont inutilement complexes. Il suffit d'utiliser l'arithmétique modulaire:
#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;
}
Si vous connaissez votre fuseau horaire, tout devient encore plus simple:
#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;
}
Qu'est-ce qui se passe ici est que, modulo un jour, nous obtenons nombre de minutes depuis minuit. Ensuite, nous ajoutons 21:00 pour obtenir le nombre de minutes depuis 21:00. Ensuite, nous soustrayons cela de 24 heures pour obtenir le nombre de minutes jusqu'au 21 heures suivantes.
Si vous avez besoin d'une plus grande précision (par exemple arrondi au nombre de minutes le plus proche, plutôt que de simplement nombre de minutes), il suffit de soustraire (tm->tm_sec>=30?0:1)
de minutes_until_9pm
, ou remplacer time(NULL)/60
avec (time(NULL)+30)/60
, respectivement.
J'ai posté une solution avec la fonction difftime utilisée. Cela assurerait la portabilité à travers les différentes saveurs * nix. Aussi "delta" même si long int, n'est pas vérifié par rapport à l'architecture sous-jacente (x86 ou x86_64 ou autre) – ZZambia