2010-02-11 37 views

Respuesta

13

El siguiente programa completo que muestra cómo acceder al valor de los segundos:

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

int main (int argc, char *argv[]) { 
    time_t now; 
    struct tm *tm; 

    now = time(0); 
    if ((tm = localtime (&now)) == NULL) { 
     printf ("Error extracting time stuff\n"); 
     return 1; 
    } 

    printf ("%04d-%02d-%02d %02d:%02d:%02d\n", 
     tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, 
     tm->tm_hour, tm->tm_min, tm->tm_sec); 

    return 0; 
} 

Genera:

2010-02-11 15:58:29 

Cómo funciona es la siguiente.

  • que llama time() para obtener la mejor aproximación a la hora actual (por lo general el número de segundos desde la época pero que en realidad no es un mandato de la norma).
  • luego llama al localtime() para convertir eso en una estructura que contiene los campos individuales de fecha y hora, entre otras cosas.
  • en ese punto, puede desregular la estructura para obtener los campos que le interesan (tm_sec en su caso, pero he mostrado algunos de ellos).

Tenga en cuenta que también se puede utilizar en lugar de gmtime()localtime() si desea que la hora de Greenwich o GMT para los que son demasiado jóvenes para recordar :-).

+0

@robUK Solo en caso de que use este código en una aplicación multiproceso con muchos subprocesos obteniendo segundos de esta manera. Es probable que 'localtime' use un mutex global en su trabajo (mientras se accede al objeto locale global). Entonces, si lo usa en una función que a menudo se denomina subprocesos, pasará su tiempo esperando en 'pthread_mutex_unloc()' –

+0

Es posiblemente peor que eso, @skwlisp. A menos que el valor de retorno sea un puntero a un objeto específico de subproceso, puede encontrarlo dañado.En un entorno enhebrado, probablemente debería usar las variantes "_r" de llamadas inseguras. Simplemente no quería complicar mi respuesta con un detalle posiblemente innecesario. – paxdiablo

+1

He estado trabajando recientemente en una implementación de la Biblioteca Standard C y quería agregar algunos detalles. 'time()' no devuelve necesariamente el número de segundos desde la época (pero sí en la mayoría de las plataformas). Y 'tm_sec' puede variar de 0 a 61 (para dar cuenta de los segundos intercalares). – tomlogic

2

Una forma más portátil para hacer esto es para obtener la hora actual como una estructura time_t:

time_t mytime = time((time_t*)0); 

recuperar un struct tm para este time_t:

struct tm *mytm = localtime(&mytime); 

Examine el tm_sec miembro del mytm. Dependiendo de su biblioteca de C, no hay garantía de que el valor de retorno de time() se base en una cantidad de segundos desde el comienzo de un minuto.

+0

'time_t mytime ((time_t *) 0);' no es válido en C y tiene un desajuste de tipo en C++. ¿Querías decir 'time_t mytime = time (0);'? –

+0

@R Samuel Klatchko: Sí, gracias. He estado haciendo demasiado C++ y luego olvidé la llamada crucial de 'tiempo'. (En realidad, olvidé el nombre de la variable originalmente, pero me arruiné solucionándolo mientras escribía la respuesta.) –

1

Creo que esto es lo que buscas. Si no, mis disculpas. :)

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

int main() { 
    char secstr[128]; 
    struct tm current_time; 
    time_t current_secs = time(NULL); 

    memset(secstr, 0, sizeof(secstr)); 

    localtime_r(&current_secs, &current_time); 
    strftime(secstr, sizeof(secstr), "%S", &current_time); 

    fprintf(stdout, "The second: %s\n", secstr); 
    return(0); 
} 
1

que desea utilizar gettimeofday:

hombre 2 gettimeofday

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

int main (int argc, char **argv) 
{ 
    int iRet; 
    struct timeval tv; 

    iRet = gettimeofday (&tv, NULL); // timezone structure is obsolete 
    if (iRet == 0) 
    { 
    printf ("Seconds/USeconds since epoch: %d/%d\n", 
      (int)tv.tv_sec, (int)tv.tv_usec); 
    return 0; 
    } 
    else 
    { 
    perror ("gettimeofday"); 
    } 

    return iRet; 
} 

Esto es mejor utilizar entonces el tiempo (0), debido a que obtiene los useconds así, de forma atómica, que es el más común caso de uso

Cuestiones relacionadas