【问题标题】:Create an ISO 8601 Duration in Javascript/Angular在 Javascript/Angular 中创建 ISO 8601 持续时间
【发布时间】:2021-07-01 23:07:04
【问题描述】:

如何在 JavaScript 中创建持续时间,然后将其格式化为 ISO 8601 持续时间,例如 2 分 30 秒将是“PT2M30S”。

这可以通过 $interval 来完成吗?或者这可以通过 Date().getTime() 来实现吗?

我有一个交互,我需要跟踪花费的时间,所以我会在开始或交互时获取日期,然后在结束时再次获取日期,相互减去然后格式化为 ISO 8601?努力寻找正确的语法或有用的库。

【问题讨论】:

  • 如果你有日期对象,那么你可以简单地使用Date.prototype.toISOString()
  • @Satpal — OP 想要一个持续时间,而不是日期和时间。
  • 如果您的时间很短(比如不到一个月),那么您可以简单地从另一个日期中减去一个日期以获得以毫秒为单位的差异,然后转换为一个间隔。唯一的问题是夏令时边界。几个月和几年的持续时间需要更多的工作,因为它们的长度不一致。

标签: javascript angularjs iso8601


【解决方案1】:

包装了一个小包来帮助解决这个问题:https://www.npmjs.com/package/tinyduration

使用示例:

import { parse, serialize } from 'tinyduration';
 
// Basic parsing
const durationObj = parse('P1Y2M3DT4H5M6S');
assert(durationObj, {
    years: 1,
    months: 2,
    days: 3,
    hours: 4,
    minutes: 5,
    seconds: 6
});
 
// Serialization
assert(serialize(durationObj), 'P1Y2M3DT4H5M6S');

您可以使用npm install --save tinydurationyarn add tinyduration 安装它

【讨论】:

    【解决方案2】:

    对于 Angular (2+)

    您可以使用我的ngx-duration-picker,它允许用户选择持续时间并自动将其转换为 ISO 8601 格式。

    here 提供现场演示。

    【讨论】:

      【解决方案3】:

      Moment 是一个非常流行的 JavaScript 日期操作库,能够在 ISO8601 中格式化持续时间。下面是一个示例,说明如何首先计算两个日期之间的差异,然后从该差异生成持续时间字符串。

      var first = moment("2015-10-01"),
        second = moment("2015-10-02");
      
      console.log(moment.duration(second.diff(first), "ms").toISOString());
      // "PT24H"
      <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.26.0/moment.min.js"></script>

      查看documentation for duration formatting了解更多详情。

      【讨论】:

      • moment.diff() 返回 ms,这意味着不能再以天为单位表示期间(聚会),因为并非每天都有相同的长度(DST 等)。
      猜你喜欢
      • 2013-02-02
      • 2014-07-16
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2015-01-25
      相关资源
      最近更新 更多