Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何表示地质时间?(增压,日期和时间?)_C++_Datetime_Boost_Gregorian Calendar - Fatal编程技术网

C++ 如何表示地质时间?(增压,日期和时间?)

C++ 如何表示地质时间?(增压,日期和时间?),c++,datetime,boost,gregorian-calendar,C++,Datetime,Boost,Gregorian Calendar,我正在尝试处理时间步长间隔数据。数据有两种格式: 1) 明确设置每个间隔(例如,1982-12-311988-01-01T00:00:00) 或 2) 开始日期设置为秒、分钟、小时、天、月或年的偏移量 我一直在使用boost::gregorian::date和boost::posix_time::ptime的组合来管理这一点,并使用这些工具来获得格式良好的字符串。然而,我现在得到的数据覆盖了190万年,每个时间段大约为10年。开始日期为0,最后一个间隔为7e8。显然,我已经达到极限了 有没有办法

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

1) 明确设置每个间隔(例如,1982-12-311988-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
(对于公元前几年的地质尺度)和
boost::gregorian::date
(对于公元前几年,如果你能承受不精确的julian/gregorian)。这样,很好的格式化就相对容易组织了

你可以考虑使用最长整数类型和一个比率,表示你在计算年份:

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;
typedef chrono::持续时间(单位:年);
第二年(1900000)的持续时间190万年
时钟::时间点t1=时钟::系统时钟::现在()-d2;

但漂亮的打印输出不会像boost那样明显。您还必须定义自己的时钟类(上面的示例将使用190万年,但由于用于实例化
系统时钟
类的参数,因此不会更多)

这是一个典型的计算机权衡:精度、范围和内存消耗。如果我是你,我会使用一个结构/类,它从某个起源起有32年的时间(1950年在许多地球物理环境中是很流行的),一个time\t或int,或者任何从年初起有秒的东西。问问Ruby开发人员。我不知道问题出在哪里。你不能用双人床吗?通常,以几十年为单位进行测量时,秒和分钟会变得不那么有趣,但即使这样,也不应该是一个问题:即使是在最大尺度(7e8)a下,您能否给出涵盖190万年的日期或时间间隔的“格式良好”的输入/输出示例?我真的不知道那会是什么样子。你真的有7位数的年,加上月和日:yyyyy-MM-DD?!我想您最好编写自己的类,将解析/格式化委托给您已经在“常规日期”中使用的库,但在事情变得复杂时切换到另一种模式。使用双精度作为基础表示可能会很好(起源于“现在”),因为它们的精度特征可能符合您的非线性要求。Fwiw,如果您想假装公历在这样的时间尺度上有效,这里是您需要的算法:谢谢,Christophe。这有助于在设计一个既能处理狭义时间又能处理大规模时间的类时提供考虑因素。