根据当前日期在 C++/Boost 中表示 ISO 8601 持续时间
Represent ISO 8601 Durations in C++/Boost depending on current date
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 天)。
我可以通过哪种方式实现它?对于所有这些闰年和其他令人讨厌的事情处理,我有比手动实施更好的选择吗?
最好使用 date/time library that's being standardized for C++20. The 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。因此,此转换不关心 "averages" 或任何内容。它获取系统时钟的纪元,并计算从该纪元到给定日期的实际天数。它将考虑公历的所有特性。包括闰年。包括那些应该是闰年但不是的年份。这些将被正确计算。
因此,tp
将是从纪元之前或之后到相关日期的正确天数。
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 天)。
我可以通过哪种方式实现它?对于所有这些闰年和其他令人讨厌的事情处理,我有比手动实施更好的选择吗?
最好使用 date/time library that's being standardized for C++20. The 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。因此,此转换不关心 "averages" 或任何内容。它获取系统时钟的纪元,并计算从该纪元到给定日期的实际天数。它将考虑公历的所有特性。包括闰年。包括那些应该是闰年但不是的年份。这些将被正确计算。
tp
将是从纪元之前或之后到相关日期的正确天数。