我想转换一对夫妇(开始_在,结束_在)到一个iso 8601的持续时间,只有一个周期设置。
举例来说:
- 2023/03/01:2023/03/10 =>P9 D(9天)而非P1 W2 D(1周2天)
- 2023/03/31:2023/04/28 =>P4W
- 2023/03/31:2023/04/29 =>P29 D(而不是P4 W1 D)
- 2023/03/31:2023/04/30 =>P1 M(因为03/31 + 1.month = 04/30)
- 2024/02/29:2025/02/28 =>P1 Y(因为2024年是闰年)
- 2024/02/29:2024/03/29 =>P1 M(因为是同一天,下个月)
在模棱两可的情况下,我总是希望更大的时期获胜。
举例来说:
- 2023/01/31:2023/02/28 =>P1 M&P4 W都是正确的,但我更喜欢P1 M,因为月>周
我知道这是非常具体的,但也许有人有一个想法如何进行?这似乎是一个问题的人已经解决了.我在互联网上找到的唯一的资源是转换一个持续时间(秒)到iso 8601,但它不能为前面描述的一些特殊情况下(例如,第4个)工作.
1条答案
按热度按时间46qrfjad1#
天
我会从计算两个日期之间的(整)天差开始:
字符串
如果其他方法都失败了,我们就用这个作为P
d
D。周
无论月份或闰年,周总是7天。我们可以通过
divmod
确定周差:型
如果余数
r
为零,则这两个日期相隔 * 正好 *w
周,或Pw
W。月
由于闰年和闰月有不同的天数,我会对剩下的两种情况采取不同的方法。我会通过以下方式计算日期之间的完整月份的近似数量:(30.436875是包含闰年的average number of days in a month)
型
然后检查这个值是否恰好是精确匹配:
型
如果是,则有P
m
M。年
多年来,我一直采取类似的方法:
型
检查通过:
型
如果为真,则给出P
y
Y。总结
一切都在一个方法中:(纯Ruby,没有Rails)
型
示例如下:
型