【问题标题】:Compare ISO 8601 periods in JavaScript比较 JavaScript 中的 ISO 8601 句点
【发布时间】:2014-12-20 12:00:46
【问题描述】:

我正在尝试比较 JavaScript 中的 ISO 8601 周期,以查看哪个周期的持续时间比另一个周期长。例如:P6M(6 个月)大于 PT10M(10 分钟)。

我找不到任何开箱即用的东西,也许你们可以帮助我实现这一目标。

【问题讨论】:

  • 小心,以周或更少为单位比较持续时间非常容易,但对于数月和数年则有问题。您需要就如何将月份和年份的持续时间转换为值达成一致,例如一年的前 6 个月有 181 或 182 天,后 6 个月有 184 天。那么 P0.5Y == P6M 总是吗? P0.5M == P2W 吗? P1M == P4W?还是 P30D?

标签: javascript iso8601


【解决方案1】:

没有可用的 OOTB 使用本机 javascript Date 对象,但 Moment.js 可以很好地处理您的 ISO8601 持续时间(重新发明几乎没有意义轮子在这里...)

例如以下demo打印:"6 months is greater than 10 minutes"

var d1 = moment.duration('P6M'),
    d2 = moment.duration('PT10M');

console.log(
    d1.humanize()
  + ( d1 < d2 ? ' is less than ' : ' is greater than ' )
  + d2.humanize()
);

【讨论】:

  • 也许,但是给定 P1Y 和 P12M,你会得到类似“1 年等于 1 年”的信息,但对于 P1M 和 P4W,你会得到“1 个月不等于 1 个月”。 P4W 应该转换为“一个月”还是“4 周”?经期很棘手。将 ISO 8601 周期转换为以秒为单位的值大约需要 10 行代码。但是一年有多少秒? 1 个月?
  • 如果我理解正确,如果没有特定的时间点(ISO 日期),则无法比较 ISO 期间,因为期间的持续时间取决于该日期。从 2015 年 2 月 1 日开始,P1M 比 2016 年缩短了 86400 秒,因为 2016 年是闰年,因此多了一天。它可能还需要考虑 DST、日历系统中的漏洞和闰秒。
猜你喜欢
  • 2012-11-22
  • 2019-06-24
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2011-06-17
  • 2011-01-10
  • 1970-01-01
  • 2012-08-28
相关资源
最近更新 更多