我需要编写一个函数,将Julian日期(年,日,日和小时)转换为标准格式(年,月,日,小时和分钟)并将其表示为字符串 . 我认为必须有一个人已经编写了一个库或组件,可以进行从日期到月份和月份的转换 . 我查看了几个众所周知的日期时间库:
-
ctime - 特别是使用tm结构和
mktime(tm *timeptr)
,因为这通常将tm结构的值设置到适当的位置,除了"The original values of the members tm_wday and tm_yday of timeptr are ignored..."这没有帮助 . -
Boost::DateTime - Gregorian构造
date(greg_year, greg_month, greg_day)
,但没有帮助 . 但是,他们确实有date_from_tm(tm datetm)
但是"The fields: tm_wday , tm_yday , tm_hour, tm_min, tm_sec, and tm_isdst are ignored."再次,没有帮助 . -
COleDateTime - 这个项目包含COM,为什么不呢? COleDateTime构造函数
COleDateTime( int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec )
没有't help. And I don't看到任何其他转换函数 .
正如您所看到的,这些都需要月份和月份,这正是我首先想要避免的 . 我必须要么缺少某些东西,要么没有找到合适的地方(不完美,尽我所能 . )
有人可以帮忙吗?我宁愿避免自己编写,因为几乎总会有一些我想念的问题 .
2 回答
我偶然发现了这个老问题,并认为我可能会向它添加一些新信息 . 我在Thomas Pornin写这个单一的现有答案是一个很好的答案,我认为这是一个挑战,以改善它 . 如果我们能够以两倍的速度产生相同的答案怎么办?也许更快?
为了测试这一努力,我在一个函数中包含了Thomas的答案:
我改善它的尝试是基于:
上述文章没有直接解决这种情况 . 然而,它确实详细描述了与日期操作有关的算法,甚至包括“一年中的一天”概念,尽管该概念与此问题中指定的概念不同:
在这个问题中,"day of year"是一个基于1的计数,1月01日是年初(1月1日= 1日) . chrono-compatible Low-Level Date Algorithms在算法civil_from_days中有一个类似的"day of year"概念,但它是过去的3月1日(3月1日==第0天) .
我的想法是,我可以从civil_from_days中选择一些零碎并创建一个新的
ymd_from_ydoy
,它不需要在12个月内迭代以找到所需的结果 . 这是我想出的:仍有分支,但较少 . 为了测试这个替代方案的正确性和性能,我写了以下内容:
此测试中有三个循环:
测试两种算法在/ - 一百万年的范围内产生相同的结果 .
时间第一个算法 .
第二个算法的时间 .
事实证明,这两种算法都是快速的...我正在测试的iMac Core i5上有几纳秒的时间 . 因此引入皮秒以获得分数纳秒的一阶估计 .
我想指出两件事:
我们开始使用皮秒作为度量单位有多酷?
std::chrono
如何轻松地与皮秒互操作有多酷?对我来说,这个测试打印出来(大约):
表示
ymd_from_ydoy2
比ymd_from_ydoy1
快约3.3倍 .希望这可以帮助 . 从这个答案中得到的重要事项:
chrono-compatible Low-Level Date Algorithms具有有用且高效的日期操作算法 . 即使您必须分开选择算法并重新组合它们,它们也很有用,如本例所示 . 算法的解释是 enable you 将它们分开并在诸如此类的示例中重新应用它们 .
<chrono>
可以非常灵活地测量非常快速的功能 . 比快速快三倍仍然是一个很好的胜利 .从一年中的某一天开始计算月份和日期似乎很容易 . 这应该这样做:
请注意,这会计算从1月开始为零的月份,但假设日期计数(一年中的某一天或一天中的某一天)从一开始计算 . 如果年份日期计数无效(超出年末),则生成的
month
值为12("month after December") .“朱利安”是一个混乱的来源,因为它也代表“儒略历”,它与格里高利历相差几十天,以及闰年的计算 . 我在这假设您只是想在一个特定的格里高利年的背景下将“一年中的一天”计数转换为“月和日” .