繁体   English   中英

如何表示地质时间? (提升日期时间?)

[英]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来代表这样的规模? 我的搜索得出的结论是“否”,在这种情况下,我们将只编写自己的类。

这是一个非常有趣的问题。 但是要达到这一领域的极限,就需要仔细考虑超出当今天文极限的风险。

日历和日期非常相关:

  • Posix时间定义为从1970年1月1日起经过的时间,不包括the秒。 boost使您可以在构建时在微秒或纳秒分辨率之间进行选择。

  • 公历自1582年10月15日开始定义。请注意,在1930年之前,一些国家使用公历,有些国家仍使用儒略历,这一过渡产生了一些有趣的事实 ,例如,英格兰和美国在1752年9月13日缺席。

  • 在它之前是儒略历,由凯撒在公元前45年定义。 请注意,尽管格式,月数和月长与公历相同,但两者之间存在13天的差异,这要考虑到多年来的累计差异。

  • 在公元前45年之前,是否有355天/年的旧罗马日历。

  • 更早之前,直到人类开始,肯定还有各种各样的其他日历。 但是一天并不总是24小时。 每一天1至3微秒的变化太阳日加起来,如果你在数百万年去了。 例如,6亿年前,一天的平均长度只有22个小时。

如果您同时在地质尺度和狭窄尺度上工作,最简单的方法就是使用一个类或一个联合来组合一个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那样明显。 而且,您必须定义自己的时钟类(上面的示例将使用1,9Mio年,但由于用于实例化system_clock类的参数而无法使用很多年)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM