c++ - 如何表示地质时间? ( boost ,日期时间?)

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

最佳答案

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

日历和日期是非常相关的:

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

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

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

  • 在公元前 45 年之前,是否存在每年 355 天的古罗马历法。

  • 更早之前,直到人类诞生之前,当然还有各种其他日历。但一天并不总是 24 小时那么长。 the solar day 每天 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;

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

关于c++ - 如何表示地质时间? ( boost ,日期时间?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31483145/

相关文章:

python - 将对象转换为日期时间

Android Date.toLocaleString() - 没有时间元素?

c++ - 如何将 Boost::asio::buffer(buf, size) 与 boost 绑定(bind)一起使用?

c++ - 找不到Boost库| C++

c++ - 如何初始化结构字段 std::map<std::string, std::string> 调用 params

C++:当我的应用程序在随机位置崩溃时从哪里开始?

python - 使用 datetime64 将字符串转换为 np.array,而不是使用 Pandas

c++ - C++11 std::bind 和 boost::bind 的区别

c++ - 通过时间比较猜测字符串。是否可以?

c++ - 可变参数(包大小为 N)和默认参数