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

时间:2015-07-17 19:16:03

标签: c++ datetime boost gregorian-calendar

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

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

2)设置开始日期,然后是秒,分,小时,天,月或年的偏移

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

有没有办法使用Boost来表示这样的比例?我的搜索导致了结论“不”,在这种情况下,我们只会编写自己的类。

1 个答案:

答案 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类的参数)。