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

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

我可以用哪种方式实现它?对于所有这些闰年和其他令人讨厌的事情处理,我有比手动实现更好的选择吗?

最佳答案

最好使用 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 因此将是正确的天数,在纪元之前或之后,到相关日期。

关于c++ - 根据当前日期在 C++/Boost 中表示 ISO 8601 持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47429231/

相关文章:

C++ 二进制转十进制?

c++ - mips64el-linux-android-g++ : error: unrecognized command line option '-mfpu=neon'

javascript - Luxon.js ISO 8601 解析

ios - 如何在 Swift 中解析这个日期时间

jQuery 完整日历,所有事件显示为全天

c++ - 如何在 C++ 中递减迭代器?

c++ - 为什么重建后的 map 类型与原始 map 类型不同?

c++ - VS12 Buiding Boost 库 fatal error LNK1104 : cannot open file 'libboost_system-vc110-mt-gd-1_58.lib'

c++ - boost::polygon bool 减法会产生额外的行

c++ - boost::property_tree::ptree 序列化和反序列化