Moment: 月と日のみでローカライズされた形式を取得する

作成日 2016年08月01日  ·  20コメント  ·  ソース: moment/moment

ロケールのソースファイルを調べましたが、年の情報なしで月と日のみを表示する形式が見つかりませんでした。 locale /zh-cn.jsファイルからの一例

longDateFormat : {
    LT : 'Ah点mm分',
    LTS : 'Ah点m分s秒',
    L : 'YYYY-MM-DD',
    LL : 'YYYY年MMMD日',
    LLL : 'YYYY年MMMD日Ah点mm分',
    LLLL : 'YYYY年MMMD日ddddAh点mm分',
    l : 'YYYY-MM-DD',
    ll : 'YYYY年MMMD日',
    lll : 'YYYY年MMMD日Ah点mm分',
    llll : 'YYYY年MMMD日ddddAh点mm分'
},

リスト形式にはすべて年があります。 LMやlmのようなフォーマットをサポートできますか: 'MMMD日'?

お知らせ下さい。

Enhancement

最も参考になるコメント

この正規表現を使用して、この問題を克服します

moment().format('L').replace(new RegExp('[^\.]?' + moment().format('YYYY') + '.?'), '')

次の変換を行います
2017年5月4日-> 2004年5月(例:私たち、GB)
2017-04-03-> 04-03(例:swe)
8.7.2017-> 8.7。 (例:フィン)

全てのコメント20件

現在、月と日のみのローカライズされた形式のトークンは提供していません。 さまざまなロケールでこれを表示する方法は複数ある可能性があるため、これにはデータの大幅な拡張が必要になります。

これをロケール形式に適合させようとするよりも、カスタム形式を使用する方がおそらく簡単です。

このタイプのフォーマットも必要です。
すべての異なるロケールで修正されるはずなので、カスタムにはしたくありません:)

こっちも一緒。

考えてみると、

すべての言語ファイルを調べたところ、ほとんどの言語でこれは非常に簡単に思えます...
@ mj1856これを始める方法について何かアイデアはありますか?

@kaljakでフォーマットを追加するのは簡単ですが、特定の言語でこれを適切に表現する方法のデータはどこで入手できますか? CLDRに似た情報源、またはそれを知るためにその言語を話した人が必要になります。

また、ここから: httpshttps://github.com/unicode-cldr/cldr-dates-full/ (これには、相対時間の短い/狭いバージョンも含まれています。これは素晴らしい追加です:))。

無関係ですが、ある時点でIntl.DateTimeFormatからロケール固有の形式を導き出し、瞬間固有のロケールデータを含めないようにすることが理にかなっているかもしれません。

私もこれが必要です。

この正規表現を使用して、この問題を克服します

moment().format('L').replace(new RegExp('[^\.]?' + moment().format('YYYY') + '.?'), '')

次の変換を行います
2017年5月4日-> 2004年5月(例:私たち、GB)
2017-04-03-> 04-03(例:swe)
8.7.2017-> 8.7。 (例:フィン)

これに+1。

私たちのウェブサイトは、ローカライズされた形式でこのようなものを示しています:
Jan 5

この文字列をスペイン語のような言語で表示する良い方法はありません。これは次のようになります。
5 de Jan年のテキストを切り取らずに、言語の違いのために保守できないようです。

つまりmoment().locale('es')format('ll') // 5 de Jan de 2018

@stenvala素晴らしい解決策!

.format('ll')と一緒に使用すると、 ,サフィックスが表示されますが、上記を修正して削除するにはどうすればよいですか?

例: Jan 29, 2018 -> Jan 29,

同じニーズに遭遇し、サポートされている方法の代わりに、サービス内で使用するヘルパークラスに次のコードを配置し、テンプレートで使用するためにAngularパイプにラップしました。 あなたのマイレージは非常に多いかもしれませんが、私はすべてのロケールファイルを確認し、新しい月と日の形式の基礎として「ll」形式を使用することのすべての異なる順列を得たと思います。 次のロケールに対してテストしました:en、es、hy-am、hu、cv、ja、lv。 それらのそれぞれは、月の名前のユニコード文字を含む興味深い順列を持っていました。

if (format.indexOf("YYYY") === 0) {
        // In some locales, the Year is presented first, along with various punctuation (period, comma) as well as sometimes
        // hard coded words in brackets. The RegEx below strips everything off that shouldn't be there related to the YYYY prefix.
        return format.replace(/YYYY(\.)?(\s)?(\[([^\x00-\x7F]|\w)+\])?(\s)?/gi, '');
    }

    // In other locales, the year is presented at the end (or almost end). It can have various punctuation around it as well
    // as hard coded words in brackets. The RegEx below strips everything off that shouldn't be there related to the YYYY suffix.
    return format.replace(/(\s)?,?(\[([^\x00-\x7F]|\w)+\])?(\s)?YYYY.*/gi, '');

幸運を!

PS-私は正規表現の第一人者ではなく、上記の表現で最善を尽くしました。 それらは機能しているように見えますが、おそらく最適化できます。

私は.format('MMMDo')を実行して、最終的に必要なものを取得しました。一般的なものではありませんが、私の場合はうまく機能します。

👍

多くの言語のフォーマットルールを持つデータソースを使用するのはどうですか。 残りの言語は、プレースホルダーテキストp.exを取得します。 'こんにちは開発者。 言語のフォーマットをmoment.jsプロジェクトに報告してください。 ありがとう'

したがって、一部の開発者が短い日付文字列を必要とし、それを使用する場合、彼はこの召喚状を受け取り、必要に応じてギャップを埋めます。

Intlを使用した別の回避策を次に示します。 optionsオブジェクトをカスタマイズして、必要な形式を取得します。 Intl.DateTimeFormatは、文字列のすべてのローカライズされた順序とローカルセパレーターを処理します。

const localizedDateMonthNoYear = (moment) => {
    if (window && window.Intl && window.Intl.DateTimeFormat) {
      let options = {
        weekday: 'short',
        month: 'short',
        day: '2-digit',
      }
      return new Intl.DateTimeFormat('default', options).format(moment.toDate())
    }
    return moment.format('ll');
}

3年以上、moment.jsが日付/時刻フォーマットライブラリとして完全であると見なされることを妨げる重大な問題についての動きはありません...徐々に標準になりつつあるIntlAPIの良さに感謝します。

Moment.jsのコア開発者の一部は現在TC39の提案に取り組んでいます。あなたが正しいので、コア言語でこの機能の一部を使用してみませんか?

JSDateのtoLocaleDateStringメソッドを使用できます。 例えば

const getFormattedDateTime = dateTime => dateTime.toLocaleDateString('ru-RU', {
  month: 'short',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
})

https://momentjs.com/docs/#/ -project-status /を参照して

新しいトークンは追加しません。

このページは役に立ちましたか?
0 / 5 - 0 評価