web-dev-qa-db-ja.com

Moment.jsを使用したロケールおよび特定の日付形式

私はプロジェクトでMoment.jsを使用し、次のように日付をフォーマットしています。

_var locale = window.navigator.userLanguage || window.navigator.language;
moment.locale(locale);
someDate.format("L");
_

それはうまくいきますが、年のない日付を表示する必要がある場合があります。一部の言語ではsomeDate.format("MM/DD")である必要があるため、someDate.format("DD/MM")のようなものは使用できません。 _L,LL,LLL_のようなものが必要ですが、年はありません。

私に何ができる?

_LTS : 'h:mm:ss A',
LT : 'h:mm A',
L : 'MM/DD/YYYY',
LL : 'MMMM D, YYYY',
LLL : 'MMMM D, YYYY LT',
LLLL : 'dddd, MMMM D, YYYY LT'
_
35
Jekyll

はい。これは少しひどいですが、そうなることは知っていました。

まず、(たとえば)'L'の実際のフォーマット文字列にアクセスできます。

var formatL = moment.localeData().longDateFormat('L');

次に、適切な正規表現の置換を使用して、手術を行うことができます。

var formatYearlessL = formatL.replace(/Y/g,'').replace(/^\W|\W$|\W\W/,'');

(つまり、YYYYを削除し、その削除によって残された孤立した区切り文字を削除します)

その後、瞬間形式呼び出しで新しい形式文字列を使用できます。

someDate.format(formatYearlessL);

これは必然的にいくつかの仮定を行います:

  • ロケールの月+日の数値形式の順序は、そのロケールの年+月+日の形式の順序と一致し、年は削除されます。
  • 短い形式では、月と日の間にのみ区切り記号が使用されます(先頭と末尾の区切り記号はありません)。
  • 短い数値の日付形式の区切り文字は常に非英数字です。
  • 形式は、記事を含む文形式ではなく、数値要素と区切り記号で構成されます(スペイン語とポルトガル語に関する以下のRGPTのコメントを参照してください。他の言語の長い形式にも適用されます)。

locale/*.jsの簡単なレビューでは、これらの仮定は私が調べたすべてのロケールファイルに当てはまりますが、それらに違反するロケールが存在する場合があります。 (ETA:以下のコメントは、ドイツの短い日付形式が2番目の仮定に違反していることを指摘しています)

追加の重要な警告として、これは壊れやすい可能性があります。 moment.jsの将来のバージョンが、現在longDateFormat...にあるデータの場所を変更する可能性は完全にあります。

24
S McCrohan

私の知る限り、MomentJSプロパティを使用して特定の言語の日付形式(年なし)を変更できます https://momentjs.com/docs/#/customization/long-date-formats/

例:

moment.updateLocale('en', {
  longDateFormat: {
    LLL: "MMMM Do, LT", // Oct 6th, 4:27 PM
  }
});

moment.updateLocale('ru', {
  longDateFormat: {
    LLL : 'D MMMM, HH:mm', // 6 окт., 16:27
  }
});
3
MegaCasper

ライブラリは、上書きできない正規表現(var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;)に対して検証されるため、新しい形式を簡単に追加できません。

ただし、新しい形式をMomentが認識するトークンに変換するために、format関数をオーバーライドできます。

たとえば、「LMD」という新しいカスタム形式を追加しましょう。最初に、使用するすべてのロケールに対して定義する必要があります。

moment.updateLocale('en', {
   longDateFormat: {
       LMD: 'MMMM D'
   }
});

moment.updateLocale('fr', {
    longDateFormat: {
        LMD: 'D MMMM'
    }
});

次に、元のフォーマット関数をオーバーライドし、inputString( "LMD")を以前に定義した実際のトークンに変換します。その後、元の関数を呼び出して、Momentに通常どおりジョブを実行させます。

var originalMomentFormat = moment.prototype.format;
moment.prototype.format = function (inputString) {
    if (inputString === 'LMD') { // check for your custom types here. maybe use constants or whatever
        inputString = moment.localeData().longDateFormat(inputString);
    }
    return originalMomentFormat.apply(this, [inputString]);
};

使用例:

moment(someDate).format('LMD');
1
Emilie