我正在尝试处理时间步长间隔数据。数据有两种格式:
1)明确设定每个间隔(例如,1982-12-31,1988-01-01T00:00:00);
或
2)设置开始日期,然后是秒,分,小时,天,月或年的偏移
我一直在使用boost::gregorian::date
和boost::posix_time::ptime
的组合来管理它,并使用这些工具来获取格式正确的字符串。但是,我现在已经获得了涵盖190万年的数据,每个时间步长大约为10年。开始日期为0,最后一个间隔为7e8。显然,我已达到极限。
有没有办法使用Boost来表示这样的比例?我的搜索导致了结论“不”,在这种情况下,我们只会编写自己的类。
答案 0 :(得分:2)
这是一个非常有趣的问题。但要达到这一领域的提升极限,需要仔细考虑超越当今天文学界限的风险。
日历和日期非常相关:
Posix时间定义为从1970年1月1日起经过的时间,不包括闰秒。 boost允许您在构建时选择微秒或纳秒分辨率。
格里高历是在1582年10月15日之后定义的。请注意,在1930年之前,一些国家使用格里高利历,有些国家仍使用朱利安日历,过渡导致一些interesting facts,例如缺席1752年9月13日在英格兰和美国。
在朱利安历法之前,由J.Caesar在公元前45年定义。请注意,虽然格式,月份和月份长度与格里高利历中的相同,但两者之间存在13天的差异,这考虑了多年来的累积差异。
在45BC之前,那里有一个有355天/年的旧罗马日历。
更久以前,直到人类开始,当然还有各种各样的日历。但是,一天并不总是24小时。如果你进入数百万年,the solar day每天1至3微秒的变化加起来。例如,在6亿年前,当天的平均长度仅为22小时。
如果你在地质和狭义尺度上工作,最简单的方法是使用一个类或一个结合long long
(对于BC省的地质尺度)和boost::gregorian::date
(多年) AC,如果你能负担不精确的julian / gregorian)。然后,良好的格式化将相对容易组织。
或者,您可以考虑使用chrono,其中包含最长的整数类型以及表示您计算年数的比率:
typedef chrono::duration<long long, ratio<31556926, 1>> duration_in_year;
duration_in_year d2(1900000); // 1,9M years
chrono::time_point<chrono::system_clock> t1 = chrono::system_clock::now() - d2;
但很好的打印输出不会像增强那么明显。而且你必须定义自己的时钟类(上面的例子将使用1,900万年但不多,因为用于实例化system_clock
类的参数)。