// 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)
alcuni commenti:
Le unità di wall
sono secondi, ma la sua base può essere arbitrario . In Unix, in genere inizia al 1970.
I secondi di salto non sono rilevanti qui.
È necessario #include <math.h>
per remainder()
.
Il period
in extendTruncatedTime()
è quasi sempre ventiquattro ore, 24 * 60 * 60, secondo la richiesta dell'OP. Cioè, data l'ora del giorno, si estende aggiungendo l'anno, il mese e il giorno del mese, in base al tempo 'muro'.
L'unica eccezione che conosco per la dichiarazione precedente è, dal momento che si parla del radar, è l'elemento dati Asterix CAT 1 I001/141, in cui il periodo è di 512 secondi, e per i quali extendTruncatedTime()
come dato non del tutto lavoro.
E c'è un altro caso importante che non copre extendTruncatedTime()
. Supponete di avere un tempo troncato composto dal giorno del mese, dall'ora e dal minuto. Come puoi compilare l'anno e il mese?
Il seguente frammento di codice aggiunge l'anno e il mese a una volta derivato da 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);
}
Come scritto, questo non gestisce input errati. Ad esempio, se oggi è il 4 luglio, la versione non priva di significato 310000
verrà convertita quietamente al 1 ° luglio. (Può trattarsi di una funzionalità, non di un bug.)
fonte
2012-10-12 13:00:14
Sì, ma come si tiene conto del fatto che, per alcuni minuti ogni giorno, il computer che esegue il codice potrebbe avere una data diversa rispetto al radar. – Gabe
Se l'orologio ha una deriva, dovrà essere sincronizzato con un protocollo, ad es. NTP. A meno che non si voglia eseguire la sincronizzazione manualmente, il che significa semplicemente misurare la deriva in intervalli di tempo fissi e calcolare l'offset della deriva media. Se la deriva è così grande che avanza al giorno successivo, è possibile incorporarla nel calcolo e sottrarre. Dopo tutto, la costruzione del tempo viene eseguita dal lato utente. Imho non molto difficile una volta che l'aritmetica del tempo è corretta, che verrebbe coperta usando boost. – count0