2015-11-04 1 views
-2

J'utilise C sur Unix. Le programme affiche l'heure et j'essaie de comprendre comment compenser l'heure actuelle en minutes et en heures.Comment faire des drapeaux de décalage d'heure et de minute en programmation C

Cette partie du code

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

et plus tard dans cette partie:

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

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

dateinfo = localtime(&now); } 

un Makes -o offset, qui compense l'heure actuelle par un certain nombre de secondes. Par exemple, -o590 compenserait l'heure actuelle de 590 secondes. J'essaye de comprendre comment faire la même chose seulement avec un drapeau -h qui décale l'heure d'un certain nombre d'heures (comme -h6 compense le temps de 6 heures) ou par un drapeau -m qui Compense le temps en minutes.

J'ai essayé de diviser le drapeau -o actuel par 60 ou 360 mais cela ne fonctionne pas. Quelqu'un peut-il me pointer dans les bonnes directions ici?

+1

«J'ai essayé de diviser le drapeau -o actuel par 60 ou 360 mais cela ne fonctionne pas ". S'il vous plaît soyez plus précis. Montrez le code exact que vous avez essayé et décrivez de quelle manière il ne fonctionne pas. – kaylum

+2

Le paramètre par défaut est en secondes. Pourquoi diviser? Vous devriez multiplier par 60 pour les minutes et 3600 pour l'heure. Donc '-m1' est en fait équivalent à' -o60' et '-h1' est' -o3600'. – alvits

Répondre

0

La structure time_t définit le nombre de secondes écoulées depuis le 1er janvier 1970 UTC.

Si vous voulez ajouter n minutes que vous devez faire:

now+= n*60 

Et pour n heures, vous devez:

now+= n*3600 

Vous pouvez également utiliser struct tm et accéder directement à la quanta fois que vous le souhaitez modifier.

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    */ 
}; 
1

Pour changer time_t par tant d'heures, minutes, secondes dans un portable mode sans compter sur time_t est un certain type entier de secondes depuis 1970, utilisez 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); 
}