我正在尝试处理时间步间隔数据。数据有两种格式:
1)每个间隔被显式设置(例如,1982-12-31,1988-01-01T00:00:00);
或
2)设置开始日期,后面跟着秒、分、小时、天、月或年的偏移量
我一直在使用boost::gregorian::date
和boost::posix_time::ptime
的组合来管理这一点,并使用这些设施来获得格式良好的字符串。然而,我现在看到的数据涵盖了190万年,每个时间步长大约是10年。起始日期为0,最后间隔为7e8。很明显,我已经达到极限了。
是否有一种方法使用Boost来表示这样的规模?我的搜索得到的结论是"不",在这种情况下,我们将只编写我们自己的类。
这是一个非常有趣的问题。但是,要达到这一领域的极限,就需要仔细考虑超越今天的天文极限的风险。
日历和日期是非常相关的:
-
Posix时间定义为从1970年1月1日开始经过的时间,不包括闰秒。Boost允许在构建时在微秒或纳秒分辨率之间进行选择。
-
公历自1582年10月15日开始定义。请注意,在1930年之前,一些国家使用公历,而一些国家仍然使用儒略历,这种过渡导致了一些有趣的事实,例如1752年9月13日在英国和美国的缺席。
-
之前是儒略历,由凯撒在公元前45年定义。请注意,虽然格式、月数和月长与公历相同,但考虑到历年累积的差异,两者之间有13天的差异。
-
公元前45年以前,有355天/年的古罗马历法。
-
更早,直到人类开始,肯定有各种各样的其他日历。但一天并不总是24小时。如果按数百万年计算,太阳日每天1到3微秒的变化会累积起来。例如,6亿年前,一天的平均长度只有22小时。
如果您在地质和狭窄的尺度上工作,最简单的方法可能是使用一个类或联合long long
(用于BC年的地质尺度)和boost::gregorian::date
(用于AC年,如果您可以承受不精确的儒略历/公历)。这样,良好的格式就相对容易组织。
或者,您可以考虑使用最长整数类型的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;
,但良好的打印输出不会像boost那样明显。您还必须定义自己的时钟类(上面的示例将使用1.9亿年,但不会更多,因为用于实例化system_clock
类的参数)。