Moment.jsを使用して、特定の年の月のすべての日を配列で取得したいと思います。例えば:
January-2014:
[
"01-wed",
"02-thr",
"03-fri",
"04-sat"
]
助言がありますか? Moment.jsのドキュメントを調べましたが、何も見つかりませんでした。私が得たクローゼットはこれでした:
moment("2012-02", "YYYY-MM").daysInMonth()
ただし、これは、特定の月の合計日数を含むintのみを返し、各日の配列は返しません。
トリックを実行する関数を次に示します(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の古いバージョンでそれを行うには、独自のゼロパディングロジックをローリングする必要があります。これは難しくはありませんが、実際には問題の焦点ではありません。
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"));
});
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');
});
以下に、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で入力する必要があることに注意してください。したがって、マップ機能は実行されません。
または、これを達成するために モーメント範囲 を使用することもできます:
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')));
日付ピッカーを作成するこの投稿に来ました(ええ...)-私はトップの答えに同様のアプローチで行きましたが、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;
}
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() );
メソッド 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>