2015-04-06 29 views

Trả lời

24

này nên làm điều đó:

var dateStart = moment('2013-8-31'); 
var dateEnd = moment('2015-3-30'); 
var timeValues = []; 

while (dateEnd > dateStart || dateStart.format('M') === dateEnd.format('M')) { 
    timeValues.push(dateStart.format('YYYY-MM')); 
    dateStart.add(1,'month'); 
} 
+2

nếu bạn chọn phạm vi ngày giống như - 2016-08-16 đến 2017-02-15, logic này sẽ không hữu ích . Vì 'Feb-2017' sẽ không được thêm vào. Đơn giản vì trong ngày bắt đầu lặp lại cuối cùng sẽ là 2017-02-16, lớn hơn 2017-02-15 –

+1

Việc chỉnh sửa bởi Alexander Swann (bên dưới) là câu trả lời hay nhất và sửa vấn đề này của tháng kết thúc bị thiếu. – LStarky

+0

chỉnh sửa thêm vào câu trả lời của tôi cũng ... thực sự tôi muốn xóa mà để cố định một ở lại, nhưng câu trả lời của tôi cần phải có 'chấp nhận' loại bỏ – vinjenzo

1

Bạn có thể thử với ví dụ này

var one = moment("2015-3-30"); 
    var two = moment("2014-8-31"); 
    var dateDiffs = []; 
    var count = Math.round(moment.duration(one.diff(two)).asMonths()); 

    month = two.month() + 1; 
    year = two.year(); 

    for (var i=1; i<=count; i++) { 
     if (month > 12) { 
     month = 1; 
     year++; 
     } 
     dateDiffs.push(year+"-"+month); 
     console.log(month); 
     month++; 
    } 

    console.log(dateDiffs); 
+0

cảm ơn cho câu trả lời, nhưng mã của bạn có một số vấn đề nếu datediffs là nhiều hơn thì 2 năm, bạn có thể kiểm tra fiddle này: https://jsfiddle.net/jcoyace0/ –

+0

nhờ sự giúp đỡ, nó hoạt động tốt trong chrome, nhưng tôi đã có ngày không hợp lệ trong firefox, tôi đang tìm một giải pháp cho lỗi này –

3

Bạn đang sử dụng nhiều định dạng trong đầu ra: YYYY-MM và YYYY-M, vì vậy tôi đã chọn đầu tiên. Bạn có thể chỉnh sửa như bạn thấy phù hợp.

var startDateString = "2012-5-30"; 
 
var endDateString = "2015-8-31"; 
 
var startDate = moment(startDateString, "YYYY-M-DD"); 
 
var endDate = moment(endDateString, "YYYY-M-DD").endOf("month"); 
 

 
var allMonthsInPeriod = []; 
 

 
while (startDate.isBefore(endDate)) { 
 
    allMonthsInPeriod.push(startDate.format("YYYY-MM")); 
 
    startDate = startDate.add(1, "month"); 
 
}; 
 

 
console.log(allMonthsInPeriod); 
 

 
document.getElementById("result").innerHTML = allMonthsInPeriod.join("<br />");
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.4/moment.min.js"></script> 
 
<div id="result"></div>

8

Tôi nghĩ câu trả lời ban đầu là không hoàn toàn đúng, vì bạn sẽ không nhận được '2015-3' trong mảng của bạn. Điều này là do thực tế ngày bắt đầu của bạn cuối cùng sẽ kết thúc như '2015-3-31' và sẽ không có điều kiện tại chỗ. Bạn có thể mở rộng nó như dưới đây.

var dateStart = moment('2013-8-31'); 
var dateEnd = moment('2015-3-30'); 
var timeValues = []; 

while (dateEnd > dateStart || dateStart.format('M') === dateEnd.format('M')) { 
    timeValues.push(dateStart.format('YYYY-MM')); 
    dateStart.add(1,'month'); 
} 
+1

Đây là một giải pháp hoàn hảo cho "những gì về tháng trước? " vấn đề với câu trả lời chính được chấp nhận. Cảm ơn bạn đã thêm nó! Điều này sẽ nhận được nhiều upvotes nhất. – LStarky

Các vấn đề liên quan