如何表示地质时间? (提升,Date_time?)

How to represent geological time? (Boost, Date_time?)

我正在尝试处理时间步长间隔数据。数据有两种格式:

1) 明确设置每个时间间隔(例如,1982-12-31、1988-01-01T00:00:00);

2) 设置开始日期后跟秒、分、时、日、月或年的偏移量

我一直在使用 boost::gregorian::dateboost::posix_time::ptime 的组合来管理它,并使用这些工具来获得格式良好的字符串。然而,我现在看到的数据涵盖了 190 万年,每个时间步长大约为 10 年。开始日期为 0,最后间隔为 7e8。显然,我已经达到了极限。

有没有办法用Boost来表示这样的规模?我的搜索得出了 'no' 的结论,在这种情况下,我们将只编写自己的 class.

这是一个很有趣的问题。但要达到这一领域的提升极限,需要仔细考虑超越当今天文极限的风险。

日历和日期非常相关:

  • Posix 时间定义为从 1970 年 1 月 1 日起经过的时间,不包括闰秒。 boost 允许您在构建时选择微秒级或纳秒级分辨率。

  • 公历自 1582 年 10 月 15 日起定义。请注意,在 1930 年之前,一些国家使用公历,一些国家仍然使用儒略历,过渡导致一些 interesting facts,例如 1752 年 9 月 13 日在英国和美国的缺席。

  • 之前是公元前 45 年 J.Caesar 定义的儒略历。请注意,虽然格式、月数和月长与公历相同,但两者之间有 13 天的差异,这考虑了多年来的累积差异。

  • 公元前45年以前,有没有355年的古罗马历days/year。

  • 更早之前,直到人类诞生之前,当然还有各种其他日历。但一天并不总是 24 小时那么长。如果经过数百万年,the solar day 每天 1 到 3 微秒的变化加起来。例如,6亿年前,一天的平均长度只有22小时。

如果您同时处理地质尺度和窄尺度,最简单的方法可能是使用 class 或结合 long long(对于公元前几年的地质尺度)和 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;

但漂亮的打印输出不会像 boost 那样明显。并且您必须定义自己的时钟 class(由于用于实例化 system_clock class 的参数,上面的示例适用于 1,9Mio 年但不会更多) .