2012-10-12 19 views
5

Ricevo dati radar come "tracce" e i dati di traccia indicano il numero di secondi UTC dall'ultima mezzanotte, apparentemente. Questo non è il numero di secondi dal 1 ° gennaio 1970.utc secondi da mezzanotte a datetime

Ora voglio convertirlo in data, sapendo che l'orologio del computer potrebbe essere leggermente fuori sincrono con l'orologio sul radar. Immagino che i secondi del radar siano il riferimento, non quelli del computer. Voglio convertire questi secondi a una data completa. Le cose sembrano essere un po 'complicate intorno alla mezzanotte di .

Qualche suggerimento? Ho qualche idea, ma non voglio perdermi nulla.

Sto lavorando con C++ Qt.

risposta

0

Se è possibile eseguire il collegamento a un'altra lib, suggerirei di utilizzare boost::date_time.

Sembra che si desideri prendere la data corrente in secondi da mezzanotte (epoca), quindi aggiungere l'ora del radar ad essa, quindi convertire la somma in una data e trasformarla in una stringa.

Utilizzando spinta vi aiuterà a:

  • ottenere il giusto ora locale
  • calcolare la data indietro
  • incorporando la deriva nel calcolo
  • prendendo secondo salto in considerazione

dal momento che avrete a disposizione concetti come intervalli di tempo e durate. Si può usare qualcosa di simile (dagli esempi Boost):

ptime t4(date(2002,May,31), hours(20)); //4 hours b/f midnight NY time 
ptime t5 = us_eastern::local_to_utc(t4); 
std::cout << to_simple_string(t4) << " in New York is " 
      << to_simple_string(t5) << " UTC time " 
      << std::endl; 

Se si desidera calcolare la deriva a mano si può fare matematica tempo facilmente simile a costruisce in questo modo:

ptime t2 = t1 - hours(5)- minutes(4)- seconds(2)- millisec(1); 
+1

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

+1

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

1
// 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.)

Problemi correlati