web-dev-qa-db-ja.com

Moment.jsで月の日リストを取得する方法

Moment.jsを使用して、特定の年の月のすべての日を配列で取得したいと思います。例えば:

January-2014:
[
"01-wed",
"02-thr",
"03-fri",
"04-sat"
]

助言がありますか? Moment.jsのドキュメントを調べましたが、何も見つかりませんでした。私が得たクローゼットはこれでした:

moment("2012-02", "YYYY-MM").daysInMonth() 

ただし、これは、特定の月の合計日数を含むintのみを返し、各日の配列は返しません。

25
ecorvo

トリックを実行する関数を次に示します(Momentではなく、Vanilla JavaScriptのみを使用)。

var getDaysArray = function(year, month) {
  var names = [ 'Sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ];
  var date = new Date(year, month - 1, 1);
  var result = [];
  while (date.getMonth() == month - 1) {
    result.Push(date.getDate() + "-" + names[date.getDay()]);
    date.setDate(date.getDate() + 1);
  }
  return result;
}

例えば:

js> getDaysArray(2012,2)
["1-wed", "2-thu", "3-fri", "4-sat", "5-Sun", "6-mon", "7-tue",
 "8-wed", "9-thu", "10-fri", "11-sat", "12-Sun", "13-mon", "14-tue",
"15-wed", "16-thu", "17-fri", "18-sat", "19-Sun", "20-mon", "21-tue", 
"22-wed", "23-thu", "24-fri", "25-sat", "26-Sun", "27-mon", "28-tue",
"29-wed"]

ES2015 +バージョン:

const getDaysArray = (year, month) => {
  const names = Object.freeze(
     [ 'Sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ]);
  const date = new Date(year, month - 1, 1);
  const result = [];
  while (date.getMonth() == month - 1) {
    result.Push(`${date.getDate()}-${names[date.getDay()]}`);
    date.setDate(date.getDate() + 1);
  }
  return result;
}

上記のソリューションは、質問に含まれているサンプル出力とは異なり、10日より前の日付をゼロパッドしないことに注意してください。 ES2017 +では、修正が非常に簡単です。

    result.Push(`${date.getDate()}`.padStart(2,'0') + `-${names[date.getDay()]}`);

JSの古いバージョンでそれを行うには、独自のゼロパディングロジックをローリングする必要があります。これは難しくはありませんが、実際には問題の焦点では​​ありません。

39
Mark Reed

Momentjsの代替、私のために働く

function getDaysArrayByMonth() {
  var daysInMonth = moment().daysInMonth();
  var arrDays = [];

  while(daysInMonth) {
    var current = moment().date(daysInMonth);
    arrDays.Push(current);
    daysInMonth--;
  }

  return arrDays;
}

確認できます

var schedule = getDaysArrayByMonth();
schedule.forEach(function(item) {
  console.log(item.format("DD/MM"));
});
11
victorkurauchi

lodash_。times も使用:

var daysInMonth = [];

var monthDate = moment().startOf('month'); // change to a date in the month of interest

_.times(monthDate.daysInMonth(), function (n) {
     daysInMonth.Push(monthDate.format('D'));  // your format
     monthDate.add(1, 'day');
});
10
vinjenzo

以下に、Moment以外の外部依存関係のない2つの素晴らしい機能的アプローチを示します。

const currentMonthDates = new Array(moment().daysInMonth()).fill(null).map((x, i) => moment().startOf('month').add(i, 'days'));
const currentMonthDates = Array.from({length: moment().daysInMonth()}, (x, i) => moment().startOf('month').add(i, 'days'));

これはMomentオブジェクトの配列を返します。その後、任意のフォーマットメソッドを実行できます。

JavaScriptで任意の長さの配列を作成して入力する については、最初の例では、マッピングする前に配列をnullで入力する必要があることに注意してください。したがって、マップ機能は実行されません。

6
tomhughes

または、これを達成するために モーメント範囲 を使用することもできます:

const month = moment('2012-02', 'YYYY-MM');
const range = moment().range(moment(month).startOf('month'), moment(month).endOf('month'));
const days = range.by('days');

console.log([...days].map(date => date.format('DD-ddd')));
4
nicolas

日付ピッカーを作成するこの投稿に来ました(ええ...)-私はトップの答えに同様のアプローチで行きましたが、forループは個人的にもう少し直感的で読みやすいと思います。これはJS 0ベースの日付を使用するため、5 = 6月、1 = 2月などです。1ベースの日付の日付の「+1」を省略できます。

var getDaysInMonth = function(year, month) {
  var names = [ 'Sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ];
  var date = new Date(year, month + 1, 0);
  var days = date.getDate();
  var dayList = [];
  for (i = days; days > 0; days--) {      
    date.setDate(date.getDate() + 1);
    dayList.Push((dayList.length + 1) + '-' + names[date.getDay()]);
  }
  return dayList;
}
2
MrRobboto

Moment.jsで月の日数を取得するには、これを使用します。

  function daysInMonth(month) {
    var count =  moment().month(month).daysInMonth();
    var days = [];
    for (var i = 1; i < count+1; i++) {
      days.Push(moment().month(month).date(i));
    }
    return days;
  }

次に、関数を呼び出す

var days = daysInMonth( moment().month() );
1
mchev

メソッド moment(month).daysInMonth() を使用して月の日数を取得し、 Array.from() を使用して配列を生成すると思いますよりクリーンで高性能な方法。

const getDaysByMonth = (month) => {
  const daysInMonth = moment(month).daysInMonth();
  return Array.from({length: daysInMonth}, (v, k) => k + 1)
};

let month = '2019-02';
console.log(`February => ${getDaysByMonth(month)}`);

month = '2019-06';
console.log(`June => ${getDaysByMonth(month)}`);

month = '2019-07';
console.log(`July => ${getDaysByMonth(month)}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
1
coderade