ISO 8601将duration format声明为P[n]Y[n]M[n]DT[n]H[n]M[n]S
。例如,P3Y0.5MT6M
表示" 3年,半月,3分钟"。
有various ways将其转换为unixtime / chrono :: duration / whatever,但我找到的所有解决方案都使用平均月份和年份持续时间(以秒为单位),根据标准不正确。相反,它应取决于日期,例如01 Feb + P1M
应为01 Mar
(+28天),而01 Mar + P1M
应为01 Apr
(+31天)。
我可以通过哪种方式实现此目的?在所有这些闰年和其他讨厌的事情处理中,我是否有比手动实施更好的选择?
答案 0 :(得分:1)
最好使用date/time library that's being standardized for C++20。 cleverly named Date library可以执行您建议的操作。它的year_month_day
类型可以按照您希望的方式添加月份和年份。
此外,转换为time_point
正确,在time_point
整数类型的精度范围内:
system_clock::time_point tp = sys_days{sun[5]/may/2016};
year_month_day
类型是根据公历制定的,该公历包含在ISO 8601中。因此,此转换并不关心“平均值”或其他任何内容。它获取系统时钟的纪元,并计算从该纪元到给定日期的实际天数。它将考虑格里高利历的所有特质。包括闰年。包括那些应该是闰年但不是闰年的年份。这些将被正确计算。
tp
将是在纪元之前或之后到相关日期的正确天数。