根据当前日期表示C ++ / Boost中的ISO 8601持续时间

时间:2017-11-22 07:43:31

标签: c++ boost iso8601

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天)。

我可以通过哪种方式实现此目的?在所有这些闰年和其他讨厌的事情处理中,我是否有比手动实施更好的选择?

1 个答案:

答案 0 :(得分:1)

最好使用date/time library that's being standardized for C++20cleverly 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将是在纪元之前或之后到相关日期的正确天数。