5

レーダーデータを「トラック」として取得しています。トラックデータは、最後の真夜中からの UTC 秒数を示しているようです。これは、1970 年 1 月 1 日からの秒数ではありません。

ここで、コンピューターの時計がレーダーの時計とわずかに同期していない可能性があることを知って、それを日付時刻に変換したいと思います。コンピューターの秒数ではなく、レーダーの秒数が参考になると思います。これらの秒を完全な日時に変換したいと思います。真夜中頃は少し難しいようです。

助言がありますか?いくつかのアイデアがありますが、何も見逃したくありません。

私はC++ Qtを使用しています。

4

2 に答える 2

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の要求によると、ほとんどの場合period、inは 24 時間、24 * 60 * 60 です。extendTruncatedTime()つまり、指定された時刻に、「ウォール」時刻に基づいて年、月、日を追加して拡張します。

  • 前の声明に対する唯一の例外は、あなたがレーダーに言及しているので、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 日に変換されます。(これは機能であり、バグではありません。)

于 2012-10-12T13:00:14.687 に答える
0

別のライブラリにリンクできる場合は、boost::date_timeを使用することをお勧めします。

真夜中 (エポック) から現在の日付を秒単位で取得し、それにレーダー時間を追加してから、合計を日時に変換し、それを文字列に変換したいようです。

ブーストを使用すると、次のことができます。

  • 正しい現地時間の取得
  • 日付をさかのぼって計算する
  • ドリフトを計算に組み込む
  • うるう秒を考慮して

時間間隔や期間などの概念を自由に使用できるためです。次のようなものを使用できます(ブーストの例から):

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);
于 2012-10-12T12:43:33.107 に答える