如何构建适用于非全局区域设置的“时刻”功能?

时间:2015-04-03 15:41:32

标签: javascript momentjs

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

我在Web项目中有一个必须使用自定义区域设置的子模块。我们不希望在此特定子模块之外使用此区域设置,但我们希望它在子模块中始终使用。所以我基本上想要一个moduleMoment(或其他),我可以调用moment,但它在自定义语言环境中工作。有没有内置的方法呢?

注意:我谈论更改现有实例的区域设置,我正在谈论调用{{1使用语言环境其他而不是其全局语言环境的函数(在所有各种不同的签名中)。所以这不起作用:

moment

...因为args将在全局语言环境中处理,然后事后的实例上的语言环境会发生变化,这已经太晚了。

2 个答案:

答案 0 :(得分:1)

我能找到的唯一方法是使用一个临时设置语言环境的函数,调用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);
    }
};

答案 1 :(得分:-1)

不幸的是,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);
}