2012-10-12 92 views
5

我将雷达数据作为“轨道”,轨道数据显示自上午十二点以来的UTC秒数。这不是自1970年1月1日以来的秒数。utc秒自从午夜到日期时间

现在我想将其转换为日期时间,知道计算机上的时钟可能与雷达上的时钟稍微不同步。我会假设雷达的秒数是参考值,而不是计算机的参考值。 我想将这些秒转换为完整的日期时间。午夜时分 周围似乎有点棘手。

有什么建议吗?我有一些想法,但我不想错过任何东西。

我正在使用C++ Qt。

回答

0

如果你可以链接到另一个库,我会建议使用boost::date_time

看起来你想从午夜(时代)以秒为单位获取当前日期,然后将雷达时间添加到它,然后将总和转换回日期时间,并将其转换为字符串。

使用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; 

如果你想计算的手就可以很容易地花同样时间的数学漂移来构建这样的:

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

是的,但是您如何解释这样一个事实,即每天运行代码的计算机可能与雷达的日期不同。 – Gabe

+1

如果时钟有漂移,它必须与协议同步,例如, NTP。除非需要手动同步,这意味着要测量固定时间间隔内的漂移并计算平均漂移的偏移量。如果漂移很大以至于第二天进展,那么可以将其纳入计算并减去。毕竟构建时间是在用户端完成的。一旦时间的运算正确,那么Imho就不会很辛苦,这将通过使用提升来解决。 – 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) 

一些解说:

  • wall的单位是秒,但其基数可以是任意的。在Unix中,它通常始于1970年。

  • 闰秒在这里不相关。

  • 您需要#include <math.h>remainder()

  • 根据OP的要求,periodextendTruncatedTime()几乎总是二十四小时,24 * 60 * 60。也就是说,考虑到一天中的时间,它会根据“墙”的时间增加年份,月份和月份的日期来扩展它。

  • 由于您提到过雷达,我知道的唯一例外是Asterix CAT 1数据项I001/141,其中的周期为512秒,并且其中给定的extendTruncatedTime()并不完全工作。

  • 还有另外一个extendTruncatedTime()不包括的重要情况。假设你给出了一个由月份,小时和分钟的日期组成的截断时间。你如何填写年份和月份?

下面的代码片段添加年份和月份从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); 
} 

书面,这不处理错误输入。例如,如果今天是7月4日,那么非荒谬的310000将悄然转换为7月1日。 (这可能是一个功能,而不是bug。)