如何使用两个不同的 relativeTime 自定义项?

How do I use two different relativeTime customizations?

我想在某些地方使用短的(例如{m: "1m"})而在其他地方使用长的(例如{m: "one minute"})。

我认为答案围绕什么是 documented here 简而言之,使用函数调整部分语言环境以满足您的需要。

这是一个简短的示例:

var useshort = false;

moment.locale( 'en', {
    relativeTime : {
        future: "in %s",
        past:   "%s ago",
        s:  "seconds",
        m:  function (/* number, withoutSuffix, key, isFuture */) { 'use strict';
         return useshort ? "1m" : "1 minute";
        },
        mm: "%d minutes",
        h:  "an hour",
        hh: "%d hours",
        d:  "a day",
        dd: "%d days",
        M:  "a month",
        MM: "%d months",
        y:  "a year",
        yy: "%d years"
    }
});

console.log(moment().subtract(1, "minute").fromNow() ); // 1 minute ago
console.log(moment().subtract(2, "minute").fromNow() ); // 2 minutes ago

useshort = true;
console.log(moment().subtract(1, "minute").fromNow() ); // 1m ago
console.log(moment().subtract(2, "minute").fromNow() ); // 2 minutes ago

由于您的需求大约是 'm',我们可以安全地忽略这些参数(我认为),因为它们不应该更改。我显示 2 分钟的偏移量以表明我们确实只修改了 'm'.

的行为

如果这对您来说太麻烦了(使用区域设置范围内的变量),另一种选择当然是制作您自己的本地 ('en-short') 并简单地硬编码short 值,然后根据需要设置语言环境。 我选择这个解决方案是因为我不知道你必须如何决定使用一种格式还是另一种格式。

为了完整起见,这取决于您知道需要操作哪个语言环境这一事实。如果语言环境的选择由最终用户决定,问题就会变得有点复杂。在那种情况下,我所能想到的就是使用 moment.localeData()._relativeTime 检索当前语言环境的配置,并将 'm' 成员更改为适合您的函数。您仍然必须找到一种方法来在适当的语言环境中表达 'm' 和 'minute' 单位(不知道该怎么做)。 这个解决方案真的是最后的手段,因为我不知道 _relativeTime 随着时间的推移是否安全 API (我猜不会)。

希望这对您有所帮助。