Moment: 持续时间格式

创建于 2013-09-05  ·  118评论  ·  资料来源: moment/moment

我们之前在 #463 和 #879 中已经提到过这个问题,但从来没有在它自己的问题中直接讨论过它。

我们需要一种格式化持续时间的方法,类似于我们格式化日期的方式。 它应该很简单:

moment.duration(x).format("H:mm:ss")

请注意,格式化标记的含义必须略有不同,因为我们表示的是经过的持续时间,而不是一天中的时间。 我建议如下:

  • hh表示“计算天数后的剩余小时数”
  • h将是hh的单个数字形式
  • HH表示“总小时数”
  • H将是HH的单个数字形式
  • HHH将意味着“包括小数在内的总小时数” - 尽管目前可以使用duration.asHours()来完成,所以这可能没有必要。

类似的格式将适用于其他单位。 在这种情况下,最高单位将是“日”,即由 24 个标准小时组成的标准日。 由于日历问题,用它来衡量年或月是没有意义的。

请注意,这个问题最近(再次)出现在 StackOverflow 上。 用户正在寻找类似duration.format("H:mm:ss")的东西。 这是解决方法:

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

这行得通,但感觉很hacky。 这应该是内置的。

New Feature Up-For-Grabs

最有用的评论

这样做不是更好吗

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

代替

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

所有118条评论

+1

moment.duration(x).format("H:mm:ss")正是我所期望的,然后才明白它不起作用。 Matt 建议的解决方法效果很好,但与 momentjs 中其他东西的优雅相比,它确实看起来很老套。

这样做不是更好吗

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

代替

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Code Bounty

@RobinvdVleuten - 在当前格式化程序中使用HH的问题在于它代表完整日期和时间的小时_portion_。 在处理 _elapsed_ 时间时,很可能有 24 小时或更长时间。 尝试过去 24 小时,您会看到它被重置为零。

我确实注意到了。 我现在使用计算出的毫秒数来格式化它,但它仍然是一个 hacky 解决方法。

您是否认为只有一个“级别”的剩余可能 - 例如,无法说“数月后的几个小时”? 我认为这是一个完全合理的限制,但只是为了一秒吐痰,我可以想象提供一个“锚”参数,如下所示:

moment.duration(x).format("hh:mm:ss", "M");

这告诉我们小时数应该以月为模。 锚点是可选的,默认为最大单位加一号(在本例中为天)。 类似地,它可以使用字符串本身来确定分钟以小时为模,秒以分钟为模。 而如果你这样做:

moment.duration(x).format("hh:ss");

...秒数将以小时为模。

这可能都不是一个好主意——它没有被解决(这个层次结构中的几周去哪里?)并且可能没有必要(人们不太可能想要这样的漏洞)。 但想想很有趣。

更严肃地说,您将如何使用这种小写/大写表示法处理月份与分钟?

我设想天将是最大单位大小,因此月份不会进入图片。 基本上,这与我们解析来自 asp.net 时间跨度的持续时间的方式相反。

说得通。

我一直在阅读 SCORM 2004 RTE (p77) 文档,我发现时间间隔表示如下,我认为这是来自标准,

理论上我可以传递一个值,如:P34H
解析器应将其解释为 1 天和 10 小时

我希望可以考虑到这一点来格式化输出
像“PHM”
格式化程序将其解释为剩余的总小时数?
我希望能够像 HH:MM 这样格式化输出

我希望这些信息有帮助

timeinterval (second, 10,2):timeinterval (second, 10, 2) 表示
数据模型元素 timeinterval 表示经过的时间,精度为 0.01
秒[1]。 SCORM 点符号绑定定义了一个特定的格式
表示时间间隔的字符串。
字符串格式如下:
P[yY][mM][dD][T[hH][nM][s[.s]S]] 其中:
• y:年数(整数,>= 0,无限制)
• m:月数(整数,>=0,无限制)
• d:天数(整数,>=0,无限制)
• h:小时数(整数,>=0,无限制)
• n:分钟数(整数,>=0,无限制)
• s:秒数或秒数(实数或整数,>=0,不是
受限制的)。 如果使用秒的小数部分,SCORM 会进一步将字符串限制为
最多 2 位数字(例如,34.45 - 有效,34.45454545 - 无效)。
• 字符文字指示符 P、Y、M、D、T、H、Mand S 将出现,如果
存在相应的非零值。
• 应支持值的零填充。 零填充不会改变
由一组字符表示的数字的整数值。 为了
例如,PT05H 等价于 PT5H 和 PT000005H。
例子:
• P1Y3M2DT3H 表示时间段为 1 年 3 个月 2 天 3 小时
• PT3H5M 表示时间段为 3 小时 5 分钟

实施者应该知道,格式和绑定是用于通信的
SCO和LMS之间的数据。 由于格式代表一段时间,
那么像PT5M这样的持续时间相当于PT300S。
如果类型为 timeinterval(second,10,2) 的数据模型元素包含一个值,则
• 代号​​Pshall 在场;
• 如果年、月、日、小时、分钟或秒的值为零,则值
和相应的字符字面指定可以省略,但至少有一个
字符文字指示符和值应存在于指示符之外
磷;
• 如果所有时间组成部分(小时、分钟
和秒)不使用。 任何时候都可以使用零值
组件(例如,PT0S)。

持续时间格式将是一个很好的补充。 不需要两个不同的“小时”标记。 假设持续时间为 32 小时。 你永远不想只提取 8 小时而不提取 1 天。

我认为@icambron有一个很好的建议。 将格式字符串解析为标记,并以最大单位表示持续时间。 按顺序一次解析一个令牌(例如,“DD:hh:ss”表示完整天数、占天数后的完整小时数、占天数+小时后的完整秒数)。

我发布了一个 moment.duration.format 插件:
https://github.com/jsmreese/moment-duration-format

我认为它解决了这个线程中的大多数想法/用例。

@jsmreese您是否考虑提交包含您的插件作为momentjs核心部分的拉取请求?

@hotzenklotz是的,我考虑过提交拉取请求。

由于@icambron在#1538 中列出的所有原因,我没有这样做。

我的插件:

  • 取决于 Lo-Dash
  • 看起来和感觉不像 Moment.js 代码
  • 使用完全不同的测试设置

我会_喜欢_让我的插件成为 Moment.js 核心的一部分……但在这些问题得到解决之前,我不会浪费他们的时间来提交请求。

我们还想确保代码可以国际化。 幸运的是,我们需要的大部分字符串都在 Unicode CLDR 中,因此只需要很少的翻译工作。

CLDR 还针对如何格式化某些类型的间隔提供了特定于语言环境的建议,这可能比任意持续时间格式更有用。 不确定这如何适合这里,但自动显示两个特定时间之间特定于语言环境的间隔可能会很好。

CLDR 还包含有关如何显示特定时间间隔(而不是持续时间)的信息,这在某些时候可能很有用......

英语(美国)日历数据

刚刚发布了一个新版本的 Moment Duration Format,它消除了之前对 Lo-Dash 或 Underscore 的依赖。

https://github.com/jsmreese/moment-duration-format

@jsmreese 非常适合我们的需求。 谢谢!

+1

+1

+1

+1

+1

+1

+1

+1

我可能在这个问题上听起来像是破纪录,但我想确保任何解决方案尽可能遵循现有约定,并且可以轻松国际化(包括为常用的持续时间格式添加类似于LLLL的符号.

有点烦人的是,CLDR 没有为格式化持续时间提供许多具体的指导方针,尽管有广泛的相对持续时间和间隔指导方针可以在其他地方使用。 但是,它们确实为持续时间单位提供了一些最低限度的指南和翻译,这将允许您在实现类似humanize()的东西时连接相关单位。

上面描述的hh / h语法感觉与 ISO8601、CLDR 和Apache使用的格式化标记有很大不同,如果可能的话,我宁愿避免使用它。

更好的建议可能是推断使用格式化模式中最重要的单位作为模数,因此h:mm:ss将显示“正常”时间,但计算 24 后的小时数(例如 26:30:00)。 目前还不清楚如何计算像"HH:MM:ss"这样的模式,或者它的用例是什么。 允许开发人员覆盖此行为似乎也很容易成为错误的来源。

本着“i18n 无处不在”的精神,CLDR 定义了持续时间格式:

  • 小时 + 分钟(在 EN-US 中h:mm
  • 小时 + 分钟 + 秒(在 EN-US 中h:mm:ss
  • 分 + 秒(在 EN-US 中m:ss
    并且为这些持续时间提供特定于语言环境的常量(类似于LLL日期格式)可能是有意义的。

不幸的是,单位大于小时的格式化持续时间真的很难通过单个格式化字符串来表达(感谢您需要考虑的复数规则),而且我无法找到任何允许的语言的 _any_ 库超过 24 小时的持续时间的简单、i18n 友好格式。 您可以做的最好的事情是扩展duration.humanize()以获取一些额外的参数,从而有效地实现 #463 中的原始提案。

简而言之,实施duration.format()可能不是一个好主意,因为我看到任何潜在的解决方案都有相当大的陷阱。 你最好的选择是改进duration.humanize() ,或者实现一个只理解小时、分钟和秒的缩减的duration.format()

+1

如果您需要快速功能来添加填充:

function padWithZero(input, length) {
    // Cast input to string
    input = "" + input;

    let paddingSize = Math.max(0, length - input.length);
    return new Array(paddingSize > 0 ? paddingSize + 1 : 0).join("0") + input;
}

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

:+1:

:+1: 惊讶的时刻不会这样做,通常它从来没有让我失望过!

+1 我使用了上面提到的时刻持续时间格式,但它没有国际化。 我正在尝试输出天数,并且可能还需要数月,这确实需要标签。

这个问题有进展吗?

+1

+1

+1

+1

:+1:

+1
为什么它仍然不在核心中?

+1 +1 +1 +1 +1

+1

+2

@jsmreese 你的插件支持 i18n 吗?

@rumeshwick :也许? 这真的取决于你如何做 i18n 以及你对我的插件的期望。

+1

我发现有可能以这种骇人听闻的方式:

  var dur = moment.duration('PT90M');
  moment(dur._data).format('[it\'s] D [days and] h [hour]');

这产生:

“1天1小时”

但是,您不能打印“这是 1 天 90 分钟”之类的内容。
就我的目的而言,这就足够了。
它不包括 i18n,但在我的情况下,我不希望通过 moment.js 解决这个问题。

嗨,这里有一个 Ember.JS 助手:

https://github.com/ember-building-blocks/ember-hbs-date-helpers

+1

+1 @vanthome的 hacky 方式:+1:

@jsmreese - 你有兴趣将你的插件合并到时刻核心吗? 这将非常有用,非常感谢。

它需要重新格式化以适应新的 ES6 实现,并将一些冗余函数替换为 moment 的等效函数,但总的来说我认为这将相当容易。

@mj1856绝对感兴趣。 我会通过电子邮件向您发送一些问题。

耶! 好样的,@ jsmreese和@mj1856!!! :拍手: :拍手: :拍手:

我来这里只是为了提议将@jsmreese的插件合并到moment js。

+1

+1

因为看起来@jsmreese的时间很短,所以我将其标记为 Up For Grabs。 本质上,提议的 PR 应该实现@jsmreesemoment-duration-format 插件的所有功能,但应该符合现在在 moment.js 中使用的 ES2015 样式,并且应该尽可能多地重用现有的 moment。 js 功能以最小化代码大小。

+1

@jsmreesemoment-duration-format插件缺少的一个功能是能够从格式化的字符串构造回一个持续时间对象。

@mj1856 ,我有兴趣将格式插件集成到moment中。 使用Up-For-Grabs标签在这里贡献是如何工作的,我应该只处理它并将 PR 提交到develop分支,还是其他人声称它?

@joshrowley没有声称,但如果你完成了它,你将成为英雄。 继续并接受它,当你准备好提交拉动。 这个比其他的要复杂一些,所以如果你愿意,请在完成之前随时提交一个拉取请求以供审查 - 我们会留意它。 我们会很挑剔,不要用这个来扩大图书馆的规模——它已经比我们想要的大了。 请注意这一点。

也许我也会处理这个问题(或者相反),但首先需要适应整个时刻的开发结构。

正在进行的 PR:#3308

大家好,我在#3615 开了一个公关,希望有人关注它!

也许这是相关的 - 遇到的问题:
moment.duration(3500000).format("hh:mm", { forceLength: true })
显示结果:58,而不是 00:58

http://stackoverflow.com/questions/41443233/using-moment-js-to-display-duration-in-format-00xx-when-duration-is-less-than-a

ms = moment(moment().format(),"YYYY-MM-DD HH:mm:ss").diff(moment(time,"YYYY-MM-DD HH:mm:ss"));
var duration = moment.duration(ms);
moment(duration._data).format("HH:mm");

格式化持续时间的另一个技巧....

var timeInSeconds = 5000;
var formattedDur = moment("1900-01-01 00:00:00").add(timeInSeconds, 'seconds').format("HH:mm:ss");

+1

请注意, @fabiogalera@befreestudios发布的技巧似乎适用于 < 24 小时的持续时间,但都不适用于超过 24 小时的持续时间。

编辑:这似乎是由于在较旧版本的时刻。 我刚刚使用最新版本再次尝试,它按预期工作。 对困惑感到抱歉。
-
我还发现了一些奇怪的舍入错误/边缘情况,由@mj1856在此线程顶部发布的原始黑客。 例如,尝试 2.3 或 4.1 小时。 这些是十进制值,应该均匀地划分为分钟数。

例如,2.3 应该正好是 2:18:00,但你会得到 2:17:59。 4.1 应该正好是 4:06:00,但你会得到 4:05:59。 这似乎是由于duration.asXXX()方法存在一些精度/舍入问题。 有没有其他人看过这个并有任何建议?

这是我基于 Date.format 的 duration.format 函数(https://gist.github.com/ptquang86/2893903)

moment.duration.fn.format = moment.duration.fn.format || function (mask): string {
            // Some common format strings
            let formatMasks = {
                "default":      "DD MM YYYY HH:mm:ss",
                shortDate:      "M/D/YY",
                mediumDate:     "MM DD, YYYY",
                longDate:       "MM DD, YYYY",
                fullDate:       "DD, MM, YYYY",
                shortTime:      "H:mm TT",
                mediumTime:     "H:mm:ss TT",
                longTime:       "H:mm:ss TT Z",
                isoDate:        "YYYY-MM-DD",
                isoTime:        "hh:mm:ss",
                isoDateTime:    "YYYY-MM-DD'T'hh:mm:ss",
            };

            let format = function () {
                let token = /D{1,2}|M{1,2}|YY(?:YY)?|([HhmsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g;

                function pad(val, len?) {
                    val = String(val);
                    len = len || 2;
                    while (val.length < len) val = "0" + val;
                    return val;
                }

                // Regexes and supporting functions are cached through closure
                return function (date, mask) {
                    mask = String(formatMasks[mask] || mask || formatMasks["default"]);

                    let D = date.days(),
                        m = date.months(),
                        y = date.years(),
                        H = date.hours(),
                        M = date.minutes(),
                        s = date.seconds(),
                        L = date.milliseconds(),
                        flags = {
                            D:    D,
                            DD:   pad(D),
                            M:    m + 1,
                            MM:   pad(m + 1),
                            YY:   String(y).slice(2),
                            YYYY: y,
                            H:    H % 12 || 12,
                            HH:   pad(H % 12 || 12),
                            h:    H,
                            hh:   pad(H),
                            m:    M,
                            mm:   pad(M),
                            s:    s,
                            ss:   pad(s),
                            l:    pad(L, 3),
                            L:    pad(L > 99 ? Math.round(L / 10) : L),
                            t:    H < 12 ? "a"  : "p",
                            tt:   H < 12 ? "am" : "pm",
                            T:    H < 12 ? "A"  : "P",
                            TT:   H < 12 ? "AM" : "PM",
                        };

                    return mask.replace(token, function ($0) {
                        return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
                    });
                };
            }();

            return format(this, mask);
        };

使用:moment.duration(10000).format("hh:mm:ss:l")

+1

这里有任何消息,会立即获得此功能吗? 共识是什么?

+1

再次碰到它就像我想使用这样一个功能的第四个项目。 我希望很快看到它在 moment.js 中实现。

+1

我一直在关注这个问题很长时间,希望这个功能能够得到实现。 这方面有什么正在进行的工作吗?

据我所知它现在正在工作,我在我的应用程序中有它,检查文档:
https://momentjs.com/docs/#/durations/

@luchillo17你是在说工作时间吗?

好吧,我刚刚尝试了 5 分钟,它正在工作。

好吧,只是想清楚我们在这里谈论的内容。 持续时间_do_ 工作。 这个问题是关于持续时间的格式。

我的错,线程那么大,以至于我在下降的过程中迷路了。

但是,现在我仔细观察,文档中列出了一个用于持续时间格式的插件:
https://momentjs.com/docs/#/plugins/duration -format/

这是你们所希望的吗? 似乎它甚至有 TypeScript 类型定义。

而且我已经测试过了,效果很好。

该插件运行良好。 希望看到它合并到 Moment.js 中。 没有它,我看不到持续时间如何有用。

它是一个插件,因为并非所有人都使用持续时间,我认为没有多少用户群需要持续时间来证明使代码库更大是合理的。

我什至很惊讶整个持续时间模块不在插件中。

或者那个。 目前,持续时间模块对我来说毫无意义。 其中的所有函数都只是简单的数学运算,无需库即可完成。
如果插件被合并,那么我可以看到它有很好的用途。

也许吧,但不考虑数学是图书馆的好处,经过实战考验的解决方案,所以你和我不必在这些任务上浪费时间,比如我不知道有这么多的持续时间标准,比如ISO 8601,持续时间模块为我负责,所以我不需要知道该标准是如何定义的。

大概吧。
无论哪种方式,我建议我们在文档中引用该插件。
这样一来,人们就知道该功能已经存在,而不必去 Google 搜索该功能。

确实,我花了一些时间才找到它的插件部分。

4 年了,业主仍然没有任何反应......这很可悲:(

嗨伙计,

这是我们仍在努力的事情。 Moment 是一个志愿者社区! 我们需要确保这样的功能具有以下属性:
1) 适用于各种环境
2) 不会给代码增加太多的体积
3)不重新发明轮子(即已经有一个插件可以做到这一点!)
4) 不破坏现有功能

这可能会在某个时候合并。
https://github.com/moment/moment/pull/3615

如果您认为文档可以更好地指向持续时间格式化插件(或其他插件!),请在此处发送 PR: https ://github.com/moment/momentjs.com/

@marwahaha

不会给代码增加太多的体积
不会重新发明轮子(即已经有一个插件可以做到这一点!)

好吧,既然 moment 库中已经有 duration-format 插件和 duration ,也许最好的解决方案是将 duration 从 moment.js 取出到单独的插件中,然后在该插件中实现所有“重”的东西?
通过这样做,将实现 2 个目标:
1) 减小 moment.js 的大小
2)直接提供最有用的功能而不是非常有限的版本。

一个巨大的挑战是,持续时间格式很难在 moment.js 支持的所有语言环境中实现。

我不希望看到这些语言环境失去他们目前拥有的有限持续时间支持,或者让 Moment 添加仅在某些语言环境中正常工作的功能。 在插件中保持持续时间格式似乎是一个很好的中间立场,可以确保 moment.js 的“核心”是稳定的,并且适用于所有人,同时让单语言环境用户可以选择使用执行特定于其语言环境的功能的插件.

持续时间格式化插件已经存在并且在文档中被引用。 那绰绰有余。

@OogieBoogieInJSON好吧,文档并没有那么有用,我基本上必须在访问文档中的插件之前检查这个问题,除非您真正尝试阅读整个文档,否则几乎没有接触到这些功能,诚然没有人这样做。

@luchillo17在使用任何东西之前,我都会阅读所有文档。 大概,这只是我。

哈哈,是的,你这样做很棒,每个人都应该这样做,但是我们大多数开发人员都有要见面的时间表,因此了解我们使用的所有库的每一个细节是不切实际的。

@luchillo17进行面向管理的编程不是文档的错。 干杯!

对于那些关注格式化时刻持续时间的人,我已经发布了我的时刻持续格式插件的 2.0.0 版本。

新版本解决/整合了过去四年版本 1 中几乎所有问题和反馈 - 包括本地化和多元化支持以及一些有用的格式选项。

在这里查看: https ://github.com/jsmreese/moment-duration-format/releases

真正的 MVP -> @jsmreese

哈。 感谢@OogieBoogieInJSON 的客气话。

我不禁要注意,我的插件建立在——而且如果没有——moment 的创建者和维护者的巨大努力,就不会存在,更不用说许多许多贡献者了。 我现在花时间重新审视我四年前创造的东西(哇,真的有那么长吗!)与他们对这个项目的持续引导相比,坦率地说是相形见绌!

Aaaaaand 版本 2.1.0 已发布。
https://github.com/jsmreese/moment-duration-format/releases

更新版本修复了 2.0 版的一些问题,并引入了moment.duration.format ,这是一个用于协调多个持续时间的格式的新功能。 不要与已经存在的moment.duration.fn.format混淆。

新函数接受一个持续时间数组,并返回一个格式化字符串数组,当您有一组必须以一致方式一起格式化的持续时间时,它很有用。

moment.duration.format([
    moment.duration(1, "second"),
    moment.duration(1, "minute"),
    moment.duration(1, "hour")
], "d [days] hh:mm:ss");
// ["0:00:01", "0:01:00", "1:00:00"]

moment.duration.format([
    moment.duration(1, "minute"),
    moment.duration(1, "day")
], "w [weeks], d [days], h [hours], m [minutes], s [seconds]", { trim: "all" });
// ["0 days, 1 minute", "1 day, 0 minutes"]

@jsmreese 2.0 之前确实导致了一些错误,因此为了安全起见,我不得不将其锁定到 1.3.0,不过感谢您保持功能/项目的活力。

@prusswan请尝试使用 2.1.0 版本。 我想知道您是否仍然看到这些错误!

我已经发布了 moment-duration-format 的 2.2.0 版本,它现在包括一个备用数字格式功能,因为toLocaleString在许多环境中没有完全实现。

https://github.com/jsmreese/moment-duration-format/releases

我已经在一系列操作系统版本从 2.2 到 7 的 Android 设备以及一系列操作系统版本从 4.3 到 11 的 iOS 设备上使用 BrowserStack 测试了新版本。还在 Chrome、Firefox、IE 8-11 上进行了测试,和边缘浏览器。

@prusswan和其他不得不将版本锁定为1.3.0的人,您可能会发现2.2.0版本最终是 2.0.0 版本应该是的替代品。

感谢所有针对此插件版本 2 记录问题的人!

在实现了 moment-duration-format 插件的第 2 版之后,第 3 版有一些明显的改进。

我在下面列出了我的想法并将它们作为问题添加到存储库中。 如果您对您想看的内容有任何想法或意见,请告诉我!

希望下一个版本将在 4 个月后发布……而不是等待第 2 版的 4 年。

  • 我已经为本地化持续时间单位标签所做的 Moment Locale 对象扩展应包含后备数字格式本地化选项。 这会将所有本地化配置放在一个地方。

  • moment-duration-format 及其后备数字格式化函数不遵循与Number#toLocaleString相同的 API 用于有效数字和派系数字。 应该更新后备函数以使用toLocaleString API,并且插件应该直接公开toLocaleString API 选项,而不是隐藏一些选项并将它们隐藏在precisionuseSignificantDigits选项。

  • 公开后备数字格式化函数以及toLocaleString功能测试函数将有助于测试并允许它们在格式化持续时间的上下文之外使用。

  • 添加类型定义以支持 TypeScript、发布 NuGet 包并支持目前使用的任何其他打包选项。 (这不必等到版本 3。)

  • 插件的测试应该现代化,最好与 Moment.js 测试设置相匹配。 (这也不必等到版本 3。)

@jsmreese 很棒的工作,但完全没有压力在短时间内两次升级主要版本。 如果它在 4 年后仍然在使用而没有更新,那么它可能已经足够好了。 我觉得这个当前的问题可以关闭,因为已经有一个解决方案(使用插件)。 可以开始一个新问题来决定这个功能是否应该成为时刻本身的一部分。

@jsmreese太棒了。 非常感谢您,而且及时! 对我来说是一笔大买卖,感谢你所做的一切。

请参阅https://momentjs.com/docs/#/ -project-status/

感谢这里的所有讨论。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

ninigix picture ninigix  ·  3评论

BCup picture BCup  ·  3评论

tanepiper picture tanepiper  ·  3评论

4rg0n picture 4rg0n  ·  3评论

M-Zuber picture M-Zuber  ·  3评论