Tengo un tiempo representado como el número de segundos transcurridos desde la medianoche del 1 de enero de 1970, UTC (los resultados de una llamada anterior a time()). ¿Cómo agrego un día a esta vez?Cómo agregar un día a un tiempo obtenido desde el tiempo()
Agregar 24 * 60 * 60 funciona en la mayoría de los casos, pero falla si el horario de verano se enciende o apaga. En otras palabras, principalmente quiero agregar 24 horas, pero a veces 23 o 25 horas.
Para ilustrar - el programa:
#include <time.h>
#include <iostream>
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
time_t time = base + i * 24 * 60 * 60;
std::cout << ctime(&time);
}
return 0;
}
Produce:
Sat Mar 11 08:00:00 2006
Sun Mar 12 09:00:00 2006
Mon Mar 13 09:00:00 2006
Tue Mar 14 09:00:00 2006
Quiero que los tiempos para el 12 de marzo de, 13, ... para ser también 8 PM.
La respuesta proporcionada por FigBug me apuntó en la dirección correcta. Pero tuve que usar localtime en lugar de gmtime.
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
struct tm* tm = localtime(&base);
tm->tm_mday += i;
std::cout << asctime(tm);
}
return 0;
}
Dame:
Sat Mar 11 08:00:00 2006
Sat Mar 12 08:00:00 2006
Sat Mar 13 08:00:00 2006
Sat Mar 14 08:00:00 2006
¿Qué es lo que quiero. Usar gmtime me da los tiempos a las 14:00:00
Sin embargo, tenga en cuenta que todos los días son sábados. Además, se va al 32 de marzo, 33, etc. Si lanzo en la función mktime estoy de vuelta donde empecé:
#include <time.h>
#include <iostream>
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
struct tm* tm = localtime(&base);
tm->tm_mday += i;
time_t time = mktime(tm);
std::cout << asctime(tm);
}
return 0;
}
me da:
Sat Mar 11 08:00:00 2006
Sun Mar 12 09:00:00 2006
Mon Mar 13 09:00:00 2006
Tue Mar 14 09:00:00 2006
¿Qué me falta ???
OK, he probado última sugerencia de FigBug que se va a utilizar:
std::cout << ctime(&time);
en lugar de asctime, pero me da los mismos resultados. Así que supongo que mi biblioteca y/o compilador están en mal estado. Estoy usando g ++ 3.4.4 en cygwin. Copié los archivos a Solaris 5.8 y usé g ++ 3.3 para compilar. ¡Obtuve los resultados correctos allí! De hecho, obtener los resultados correctos si utilizo ctime o asctime para la salida:
Sat Mar 11 08:00:00 2006
Sun Mar 12 08:00:00 2006
Mon Mar 13 08:00:00 2006
Tue Mar 14 08:00:00 2006
también consigo los resultados correctos (con ambas funciones de salida) en Red Hut Linux con g ++ 3.4.6.
Así que supongo que me he encontrado con un error de Cygwin.
Gracias por toda su ayuda y consejos ....
Creo que desea utilizar ctime no asctime en la versión final ya que desea la hora en su zona horaria local. time() devuelve UTC, localtime() lo convierte en su zona horaria. Agregue un día en su zona horaria, conviértalo nuevamente a UTC. Imprima en su zona horaria con ctime(). Muy confuso. –
Una línea más: tm-> tm_wday = (tm-> tm_wday + i)% 7; –
No necesita preocuparse: desde mktime docs: Los valores originales de los miembros tm_wday y tm_yday de timeptr se ignoran, y los rangos de valores para el resto de sus miembros no están restringidos a sus valores normales (como tm_mday está entre 1 y 31). –