处理子秒精度UTC时间算术的闰秒

时间:2016-03-18 15:38:10

标签: datetime c++11 time signal-processing real-time

我正在进行实时信号处理:

我的输入是标有时间戳的样本。 我的输出是使用 UTC

中的时间戳标记的估算值

我需要补偿处理延迟,因此在样本N我输出样本N-K的估计值,K是我的处理延迟。

时间补偿必须是闰秒。即延迟为10ms

INPUT  TS = 20150701T000000.000000 
OUTPUT TS = 20150630T235960.990000

我认为struct tm是时间戳,利用了第61秒。

但我无法找到(struct tm< - > TAI )翻译功能。

2 个答案:

答案 0 :(得分:0)

使用D. J. Bernstein's libtai外部TAI64格式值作为时间戳。

答案 1 :(得分:-1)

Howard Hinnant's timezone library(免费,开源,跨平台,C ++ 11)将处理这个问题:

#include "date/tz.h"
#include <iostream>
#include <sstream>

int
main()
{
    using namespace std;
    using namespace std::chrono;
    using namespace date;
    istringstream in{"20150701T000000.000000"};
    utc_time<microseconds> ts;
    in >> parse("%Y%m%dT%H%M%S", ts);
    ts -= 10ms;
    std::cout << format("%Y%m%dT%H%M%S", ts) << '\n';
}

输出:

20150630T235960.990000

utc_time<microseconds>是一个微秒精度的时间戳,可以闰秒识别。可以对它进行算术运算,格式化并解析它。它取决于IANA timezone database的闰秒信息来源。此库可以配置为自动下载此信息,也可以手动下载。 documentation包含linux,macOS和Windows的完整安装说明。甚至iOS和Android都有支持。该库可以从C ++ 11中直接移植。

这个库也被投票到C ++ 20规范草案中,并且已经记录在案here。因此,到时候,您将能够从C ++供应商而不是this timezone library获得此功能。