2010-03-06 7 views
4

Je veux obtenir le nombre de secondes écoulées depuis minuit.Comment calculer le nombre de secondes depuis le début de cette journée?

Voici ma première supposition:

time_t current; 
    time(&current); 
    struct tm dateDetails; 
    ACE_OS::localtime_r(&current, &dateDetails); 

    // Get the current session start time 
    const time_t yearToTime  = dateDetails.tm_year - 70; // year to 1900 converted into year to 1970 
    const time_t ydayToTime  = dateDetails.tm_yday; 
    const time_t midnightTime = (yearToTime * 365 * 24 * 60 * 60) + (ydayToTime* 24 * 60 * 60); 
    StartTime_     = static_cast<long>(current - midnightTime); 

Répondre

10

Vous pouvez utiliser l'API standard C:

  1. Obtenez heure actuelle avec time().
  2. Convertissez-le en struct tm avec gmtime_r() ou localtime_r().
  3. Définissez tm_sec, tm_min, tm_hour sur zéro.
  4. Convertissez-le en time_t avec mktime().
  5. Trouvez la différence entre la valeur initiale time_t et la nouvelle.

Exemple:

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

time_t 
day_seconds() { 
    time_t t1, t2; 
    struct tm tms; 
    time(&t1); 
    localtime_r(&t1, &tms); 
    tms.tm_hour = 0; 
    tms.tm_min = 0; 
    tms.tm_sec = 0; 
    t2 = mktime(&tms); 
    return t1 - t2; 
} 

int 
main() { 
    printf("seconds since the beginning of the day: %lu\n", day_seconds()); 
    return 0; 
} 
2

également un modulo au nombre de secondes dans une journée est ok:

return nbOfSecondsSince1970 % (24 * 60 * 60) 
1

Voici une autre solution possible:

time_t stamp=time(NULL); 
struct tm* diferencia=localtime(&stamp); 
cout << diferencia->tm_hour*3600; 

I pense est plus simple, j'ai essayé la solution ci-dessus et cela n'a pas fonctionné dans VS200 8.

P.S .: Désolé pour mon anglais.

EDIT: Cette sortie aura toujours le même numéro, car il multiplie le nombre d'heures seulement - donc s'il est 02h00 sera toujours sortie 7200. Utilisez plutôt ceci:

time_t stamp=time(NULL); 
struct tm* diferencia=localtime(&stamp); 
cout << ((diferencia->tm_hour*3600)+(diferencia->tm_min*60)+(diferencia->tm_sec)); 
Questions connexes