2009-10-03 14 views

Répondre

2

Calculez simplement le delta à 21h aujourd'hui. Si c'est négatif, ajoutez 24hrs pour obtenir le delta à demain 21pm.

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

int main(int argc, char* argv[]) { 
    struct tm* tm; 
    time_t ts=time(NULL); 
    if(tm=localtime(&ts)) { 
      long int delta; 
      tm->tm_hour = 21; 
      tm->tm_min = 0; 
      tm->tm_sec = 0; 
      delta = mktime(tm) - ts; 
      if(delta<0) { 
        delta+=24*60*60; 
      } 
      printf("%d minutes til (next)9pm\n",delta/60); 
    } 
    return 0; 
} 
+0

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

0

Cela vous donnera les minutes jusqu'à 21 heures .:

time_t currenttime; 
time_t ninePM; 
struct tm * timeinfo; 
int minutesUntilNine; 

// Fill currenttime + convert to struct tm 
time (&currenttime); 
timeinfo = localtime (&rawtime); 

// Check for after 9pm... 
if (timeinfo->tm_hour >= 21) // Are we after 9pm? 
    timeinfo->tm_day++; // increment our day 

// Set timeinfo to the time you want... 
timeinfo->tm_sec = 0; 
timeinfo->tm_min = 0; 
timeinfo->tm_hour = 21; // 9pm 
ninePM = mktime(timeinfo); 

minutesUntilNine = (ninePM - currenttime)/60; 
+0

Cela ne pouvait pas fonctionner lors de l'encapsulation de la fin du mois (tm_day ++). – ZZambia

+0

Dommage de voir une bonne réponse marquée le pire. Reed, je pense que vous devez également mettre le isdst à -1 lorsque vous incrémentez le jour. Cela fera en sorte que si l'heure d'été commence ou se termine entre temps, vous obtiendrez 21 heures. La plupart des autres réponses seront erronées à la transition de l'heure d'été car ce jour-là le nombre de secondes par jour n'est pas de 24 * 60 * [email protected], mktime() normalise les champs de la structure. Par exemple 32 Jan -> 1 Feb. –

0

Une façon simple est de calculer le nombre d'heures et minutes (étant donné que le temps est maintenant, en plus du fait qu'il ya des 24 heures par jour), et multipliez le nombre d'heures par 60 pour obtenir un nombre de minutes. Alternativement, au lieu d'utiliser une horloge de 24 heures pour exprimer l'heure, utilisez une horloge de 1440 minutes: il est facile de soustraire une heure d'une autre, pour obtenir un décalage horaire.

1

Ici, il est (sortie en quelques secondes ...)

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

int main(void) 
{ 
    double dt = 0.0f; 
    time_t ti = time(NULL); 
    time_t tf; 
    struct tm *pt_actual = localtime(&ti); 

    struct tm t_actual = *pt_actual; 
    struct tm t_target = *pt_actual; 

    t_target.tm_hour = 21; // 09:00 pm 
    t_target.tm_min = 0; 

    tf = mktime(&t_target); 

    dt = difftime(tf, ti); 
    if (dt < 0) 
    dt += (24*60*60); // if negative, just consider **next** 9pm target, add a day 

    printf("difftime = %f seconds\n", dt); 
    return 0; 
} 
0

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.

+0

Vraiment plus simple ... malheureusement "time (NULL)/60" offrirait 59 chances d'obtenir un mauvais résultat tombant dans la troncature du résultat. De plus, avez-vous déjà recherché le code asm du reste par (21 * 60) ??!?! Une somme si négative serait beaucoup plus facile à un mauvais compilateur, et de loin plus portable sur n'importe quel ** C ** saveur. – ZZambia

+0

Eh bien, vous agissez comme les autres solutions n'ont pas le problème de troncature. Ils font. J'ai ajouté des instructions pour les faire circuler, mais en général, ce n'est pas un gros problème. (21 * 60) 'était une faute de frappe, je voulais dire (24 * 60)'. Bien sûr, la performance n'est pas excellente, mais ce n'est pas pire que n'importe quelle autre méthode de calcul, comme 'localtime()', qui est ce que les autres utilisent. Cependant, j'optimiserai le premier signe de tête pour utiliser l'arithmétique modulaire. – Zarel

+0

En outre, en considérant 'localtime()' est plus lent qu'un seul module, je doute que la différence soit significative. – Zarel

0

Version C99:

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

int main(void) 
{ 
    struct tm now = *localtime(&(time_t){ time(NULL) }); 
    struct tm then = now; 
    then.tm_hour = 21; 
    then.tm_min = 0; 
    then.tm_sec = 0; 
    int dt = ((int)round(
     difftime(mktime(&then), mktime(&now))/60) + 24 * 60) % (24 * 60); 
    printf("time till 9pm: %i minutes\n", dt); 
} 
0

Plus profond, si moins utile, la réponse est qu'il n'y a pas de réponse simple.

Comment savez-vous même qu'aujourd'hui aura un 21h? OK, bien sûr, je suis sûr que tous les fuseaux horaires qui existent n'excèdent jamais 21h00, mais ils passent des heures au milieu de la nuit une fois par an.

Les calendriers sont une catastrophe de complexité. Il faut se méfier.

Questions connexes