// Function to extend truncated time, given the wall time and period, all
// in units of seconds.
//
// Example: Suppose the truncated period was one hour, and you were
// given a truncated time of 25 minutes after the hour. Then:
//
// o Actual time of 07:40:00 results in 07:25:00 (07:40 + -15)
// o Actual time of 07:10:00 results in 07:25:00 (07:10 + +15)
// o Actual time of 07:56:00 results in 08:25:00 (07:56 + +29)
double extendTruncatedTime(double trunc, double wall, int period) {
return wall + remainder(trunc - wall, period);
}
#define extendTruncatedTime24(t) extendTruncatedTime(t, time(0), 24 * 60 * 60)
algunos comentarios:
Las unidades de wall
son segundos, pero su base puede ser arbitraria . En Unix, generalmente comienza en 1970.
Los segundos intercalares no son relevantes aquí.
Necesita #include <math.h>
para remainder()
.
La period
en extendTruncatedTime()
es casi siempre de veinticuatro horas, 24 * 60 * 60, según lo solicite la OP. Es decir, dado el momento del día, lo amplía agregando el año, el mes y el día del mes, según el tiempo de "pared".
La única excepción que conozco al enunciado anterior es que, como mencionas el radar, está en el elemento de datos de CAT 1 de Asterix I001/141, donde el período es de 512 segundos y para el que extendTruncatedTime()
no es suficiente trabajo.
Y hay otro caso importante que extendTruncatedTime()
no cubre. Supongamos que le dan un tiempo truncado que consiste en el día del mes, la hora y el minuto. ¿Cómo se puede completar el año y el mes?
El siguiente fragmento de código añade el año y mes a la vez deriva de un formato DDHHMM:
time_t extendTruncatedTimeDDHHMM(time_t trunc, time_t wall) {
struct tm retval = *gmtime_r(&trunc, &retval);
struct tm now = *gmtime_r(&wall, &now);
retval.tm_year = now.tm_year;
retval.tm_mon = now.tm_mon;
retval.tm_mon += now.tm_mday - retval.tm_mday > 15; // 15 = half-month
retval.tm_mon -= now.tm_mday - retval.tm_mday < -15;
return timegm(&retval);
}
Como está escrito, esto no maneja las entradas erróneas. Por ejemplo, si hoy es 4 de julio, el 310000
que no es absurdo se convertirá silenciosamente al 1 de julio. (Esto puede ser una función, no un error.)
Sí, pero ¿cómo se explica el hecho de que, durante unos minutos cada día, la computadora que ejecuta el código puede tener una fecha diferente que el radar. – Gabe
Si el reloj tiene una deriva, tendrá que estar sincronizado con un protocolo, p. NTP. A menos que uno quiera sincronizar a mano, lo que simplemente significa medir la deriva en intervalos de tiempo fijos y calcular el desplazamiento de la deriva promedio. Si la deriva es tan grande que avanza al día siguiente, uno puede incorporar eso en el cálculo y restar. Después de todo, la construcción del tiempo se está haciendo en el lado del usuario. No es muy difícil una vez que la aritmética de tiempo es correcta, lo que se cubriría mediante el uso de impulso. – count0