簡體   English   中英

如何使用 Moment.js 獲取一個月中的天數列表

[英]How to get list of days in a month with Moment.js

使用 Moment.js 我想在一個數組中獲取特定年份一個月中的所有天數。 例如:

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

有什么建議么? 我瀏覽了 Moment.js 文檔,但找不到任何東西。 我得到的衣櫃是這樣的:

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

但這只會返回一個整數,其中包含特定月份的總天數,而不是每天的數組。

這是一個可以解決問題的函數(不使用 Moment,而是使用普通的 JavaScript):

var getDaysArray = function(year, month) {
  var monthIndex = month - 1; // 0..11 instead of 1..12
  var names = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ];
  var date = new Date(year, monthIndex, 1);
  var result = [];
  while (date.getMonth() == monthIndex) {
    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 = (function() {
  const names = Object.freeze([ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ]);
  return (year, month) => {
    const monthIndex = month - 1
    const date = new Date(year, monthIndex, 1);
    const result = [];
    while (date.getMonth() == monthIndex) {
      result.push(`${date.getDate()}-${names[date.getDay()]}`);
    date.setDate(date.getDate() + 1);
    }
    return result;
  }
})();

作為旁注,您可以看到聲明日期const並不能阻止我們對其進行變異( Object.freeze也不會,用於使工作日名稱數組不可變,對Date做任何事情)。 我們在這里利用了可變性,但是如果我們真的想要一個不可變的 Date ,並且在當前的 Javascript 中使用強制執行該不變性的語言,我們就必須使用length

另請注意,與問題中包含的示例輸出不同,上述解決方案不會將 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"));
});

下面是兩個不錯的函數式方法,除了 Moment 之外沒有外部依賴:

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 填充數組,因為在這樣做之前它仍然被歸類為空,因此 map 函數不會跑。

你可以使用_.times助手從lodash旁邊那一刻就像這樣:

 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('DD-ddd')); // your format monthDate.add(1, 'day'); }); console.log(daysInMonth)
 <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

或者,您現在可以使用矩范圍來實現這一點:

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')));

我認為使用方法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>

要使用 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() );

來到這篇文章制作日期選擇器(是的...) - 我采用了類似的方法來獲得最佳答案,但我認為 for 循環個人更直觀/可讀。 這確實使用基於 JS 0 的日期,所以 5 = 六月,1 = 二月,等等 - 您可以省略日期中的“+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;
}
function getAllDatesOfMonth(date) {
    const mDate = moment(date, "YYYY-MM");
    const daysCount = mDate.daysInMonth();
    return Array(daysCount).fill(null).map((v,index)=>{
        const addDays = index === 0 ? 0 : 1;
        return mDate.add(addDays, 'days').format('YYYY-MM-DD');
    });
}

你可以使用 for 循環來實現

 var daysInMonth = []; var monthDate = moment().startOf('month'); for(let i=0;i<monthDate.daysInMonth();i++){ let newDay=monthDate.clone().add(i,'days'); daysInMonth.push(newDay.format('DD-ddd')); } console.log(daysInMonth)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

這是一種有點不同的方法,但可以用於一個月中的天數列表:

const getListOfDays = (year, month) => {
  const list = [];
  const date = `${year}-${('0'+month).slice(-2)}`
  const from = moment(date);
  const to = moment(date).add(1, 'months');
  for (let m = moment(from); m.isBefore(to); m.add(1, 'days')) {
   list.push(m.format('YYYY-MM-DD'));
  }
  return list;
};

console.log(getListOfDays(2022,9))

從 moment.js 版本 2.1.0 開始,當您設置如下日期時:

    moment([2012, 0, 31]).month(1).format("YYYY-MM-DD"); // 2012-02-29

然后你只需要解析日期,你就可以得到一個月的天數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM