【问题标题】:Represent ISO 8601 Durations in C++/Boost depending on current date根据当前日期在 C++/Boost 中表示 ISO 8601 持续时间
【发布时间】:2017-11-22 07:43:31
【问题描述】:

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

我可以通过哪种方式实现这一点?在处理所有这些闰年和其他令人讨厌的事情时,我有什么比手动实施更好的选择吗?

【问题讨论】:

  • 只是一个简短的说明。小数只允许在指定的最后一个单位上使用。

标签: c++ boost iso8601


【解决方案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 将是正确的天数,在纪元之前或之后,到相关日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2014-08-16
    • 2010-10-23
    • 2015-07-01
    相关资源
    最近更新 更多