2012-10-12 82 views
5

Estoy obteniendo datos de radar como "pistas" y los datos de la pista indican el número de segundos UTC desde la última medianoche, aparentemente. Este no es el número de segundos desde el 1 de enero de 1970.segundos utc desde la medianoche hasta la fecha

Ahora quiero convertir ese tiempo a la fecha, sabiendo que el reloj de la computadora podría estar un poco fuera de sincronización con el reloj del radar. Asumiré que los segundos del radar son la referencia, no los de la computadora. Quiero convertir estos segundos a un tiempo de fecha completo. Las cosas parecen ser un poco complicadas alrededor de medianoche.

¿Alguna sugerencia? Tengo algunas ideas, pero no quiero perderme nada.

Estoy trabajando con C++ Qt.

Respuesta

0

Si puede enlazar con otra lib, sugiero usar boost::date_time.

Parece que desea tomar la fecha actual en segundos desde la medianoche (época) luego agregarle el tiempo de radar, luego convertir la suma a una fecha y transformarla en una cadena.

Usando impulso le ayudará en:

  • conseguir el tiempo local justo
  • el cálculo de la fecha de regreso
  • incorporando la deriva en el cálculo
  • teniendo los segundos intercalares en cuenta

ya que tendrá un concepto como intervalos de tiempo y duraciones a su disposición. Se puede usar algo como (a partir de los ejemplos de impulso):

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; 

Si se desea calcular la deriva con la mano que puede hacer matemáticas tiempo fácilmente similar a las construcciones de esta manera:

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

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

+1

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

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) 

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

Cuestiones relacionadas