如何构建'瞬间'在非全局区域设置中工作的函数

How can I build a 'moment' function that works in a non-global locale?

本文关键字:区域 全局 设置 函数 工作 瞬间 何构建 构建      更新时间:2023-09-26

使用MomentJS,如果需要,我可以使用.locale(或旧版本中的.lang)在特定时刻实例(而不是全局)上设置区域设置。如何创建一个等效于moment(它的所有42个签名)的函数,该函数始终在不同于全局的特定区域设置中工作?

我在一个web项目中有一个子模块,它必须使用自定义区域设置。我们不希望这个区域设置在这个特定的子模块之外使用,但我们希望它在该子模块内始终使用。所以我基本上想要一个moduleMoment(或其他什么),我可以像moment一样调用它,但它可以在自定义区域设置中工作。有什么内置的方法可以做到这一点吗?

注意:我不是在谈论更改现有实例的区域设置,而是在谈论使用与其全局区域设置不同的区域设置来调用moment函数(具有各种不同的签名)。所以这不会起作用:

var m = moment(args).locale(localeId);

因为args将在全局区域设置中进行处理,然后实例的区域设置在事后发生更改,这已经太晚了。

我能找到的唯一方法是使用一个函数来临时设置语言环境,调用moment,然后将语言环境设置回以前的语言环境,如下所示:

function moduleMoment() {
    var prevLocaleId, m;
    prevLocaleId = moment.locale();
    try {
        moment.locale(customLocaleId);
        m = moment.apply(this, arguments);
        return m;
    } finally {
        moment.locale(prevLocaleId);
    }
}

或者可以将其添加到moment中,如下所示:

moment.localized = function(locale) {
    var prevLocaleId, m, args;
    prevLocaleId = moment.locale();
    try {
        moment.locale(locale);
        m = moment.apply(this, Array.prototype.slice.call(arguments, 1));
        return m;
    } finally {
        moment.locale(prevLocaleId);
    }
};
不幸的是,Moment似乎不支持此功能。GitHub问题跟踪器中有一个新功能请求:https://github.com/moment/moment/issues/2291

您可以编写一个函数,将其参数转发给moment构造函数,然后应用所需的语言。

这里有一个例子:

function localizedMoment() {
    return moment.apply(null, arguments).locale("fr");
}

如果您需要允许一个参数,只需使用Array.prototype.slice:

function localizedMoment(locale) {
    var args = Array.prototype.slice.call(locale, 1);
    return moment.apply(null, args).locale(locale);
}