2009-12-07 21 views
10

Necesito agregar segundos a una fecha. Por ejemplo, si tengo una fecha como 2009127000000, necesito agregar los segundos a esta fecha. Otro ejemplo, agregue 50 segundos a 20091231235957.agregar segundos a una fecha

¿Es esto posible en C?

+0

Creo que el formato de fecha en su ejemplo es subespecificada. 2009127000000 podría ser el 7 de diciembre o el 27 de enero. – Thomas

+0

@benjamin, lea las páginas man para ctime (funciones de conversión de fecha/hora) y strptime (convierte la representación de cadena de una estructura time tm) – Glen

Respuesta

7

El tipo de fecha/hora C time_t se implementa como el número de segundos desde una fecha determinada, por lo que para agregarle segundos, simplemente use la aritmética normal. Si esto no es lo que preguntas, aclara tu pregunta.

+16

'time_t' es comúnmente segundos, pero no necesariamente. –

7

Use tipos y funciones de <time.h>.

time_t now = time(0); 
time_t now_plus_50_seconds = now + 50; 
time_t now_plus_2_hours = now + 7200; 

<time.h> declara funciones que tienen que ver con time_t y struct tm tipos. Estas funciones pueden hacer todo lo que quieras.

+0

debería ser la respuesta. Limpio, claro y tiene excelentes ejemplos. +1 – MyDaftQuestions

+0

Actualizado '' de POSIX 2016: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/time.h.html – pmg

19

En POSIX, el valor time_t se especifica en segundos, sin embargo, eso no está garantizado por el estándar C, por lo que podría no ser cierto en sistemas que no sean POSIX. Comúnmente es (de hecho, no estoy seguro de la frecuencia con la que no es un valor que representa los segundos).

He aquí un ejemplo de cómo agregar valores de tiempo que no asume una time_t representa segundos utilizando las instalaciones de la biblioteca estándar, que en realidad no son especialmente grandes para la manipulación del tiempo:

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

int main() 
{ 
    time_t now = time(NULL); 

    struct tm now_tm = *localtime(&now); 


    struct tm then_tm = now_tm; 
    then_tm.tm_sec += 50; // add 50 seconds to the time 

    mktime(&then_tm);  // normalize it 

    printf("%s\n", asctime(&now_tm)); 
    printf("%s\n", asctime(&then_tm)); 

    return 0; 
} 

Analizar la cadena de tiempo en una adecuada struct tm variable se deja como un ejercicio. La función strftime() se puede utilizar para formatear una nueva (y la función POSIX strptime() puede ayudar con el análisis sintáctico).

+1

¿cómo obtengo un 'time_t' del' then_tm' modificado? – Lazer

+2

@Lazer: 'mktime' devuelve el' time_t' que desea. –

+0

@Michael Burr. Esto será cierto solo si los segundos son menos de 60. Quiero decir que debe hacer todo el cálculo usted mismo – abhi

1

intentar algo como esto: (Nota: no hay comprobación de errores)

include <time.h> 

char* string = ...; 
char buf[80]; 
struct tm; 
strptime(string, "%Y%m...", &tm); 
tm->tm_isdst = 0; 
strftime(buf, sizeof(buf), "%Y%m...", localtime(mktime(&tm) + 50)); 
Cuestiones relacionadas