// 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 日に変換されます。(これは機能であり、バグではありません。)