Moment JS bắt đầu và kết thúc tháng nhất định


94

Tôi cần tính toán ngày JS đã cho năm = 2014 và tháng = 9 (tháng 9 năm 2014).

Tôi đã thử điều này:

var moment = require('moment');
var startDate = moment( year+'-'+month+'-'+01 + ' 00:00:00' );
            var endDate = startDate.endOf('month');
            console.log(startDate.toDate());
            console.log(endDate.toDate());

Cả hai nhật ký đều hiển thị:

Tue Sep 30 2014 23:59:59 GMT+0200 (CEST)
Tue Sep 30 2014 23:59:59 GMT+0200 (CEST)

Ngày kết thúc là chính xác nhưng ... tại sao ngày bắt đầu lại không?

Câu trả lời:


178

Đó là bởi vì thay endOfđổi giá trị ban đầu.

Trích dẫn có liên quan:

Thay đổi thời điểm ban đầu bằng cách đặt nó thành cuối một đơn vị thời gian.

Đây là một chức năng ví dụ cung cấp cho bạn kết quả đầu ra bạn muốn:

function getMonthDateRange(year, month) {
    var moment = require('moment');

    // month in moment is 0 based, so 9 is actually october, subtract 1 to compensate
    // array is 'year', 'month', 'day', etc
    var startDate = moment([year, month - 1]);

    // Clone the value before .endOf()
    var endDate = moment(startDate).endOf('month');

    // just for demonstration:
    console.log(startDate.toDate());
    console.log(endDate.toDate());

    // make sure to call toDate() for plain JavaScript date type
    return { start: startDate, end: endDate };
}

Người giới thiệu:


4
momentlà Idempotent nên bạn cũng có thể sử dụng endDate = moment(starDate).endOf("month") ^. ^
Cảm ơn bạn

1
Trên thực tế, cách mặc định để sao chép một đối tượng trong tài liệu là moment(<value>). Đã cập nhật ví dụ để sử dụng một số hàm ngắn hơn.
klyd

1
Cảm ơn bạn. Tôi đã dành hai giờ để cố gắng tìm ra lý do tại sao nó không hoạt động.
Leon

1
lần đầu tiên tôi thấy từ Idempotent được sử dụng trên web !! thực hiện tốt naomik
Mike

add(-1,"month")không hoạt động khi tháng Giêng của nó và bạn muốn lấy tháng của năm ngoái.
Akhoy

20

bạn có thể sử dụng nó trực tiếp cho ngày kết thúc hoặc ngày bắt đầu của tháng

new moment().startOf('month').format("YYYY-DD-MM");
new moment().endOf("month").format("YYYY-DD-MM");

bạn có thể thay đổi định dạng bằng cách xác định một định dạng mới


16

Khi bạn sử dụng, .endOf()bạn đang thay đổi đối tượng mà nó được gọi, vì vậy startDatesẽ trở thành ngày 30 tháng 9

Bạn nên sử dụng .clone()để tạo một bản sao của nó thay vì thay đổi nó

var startDate = moment(year + '-' + month + '-' + 01 + ' 00:00:00');
            var endDate = startDate.clone().endOf('month');
            console.log(startDate.toDate());
            console.log(endDate.toDate());

Mon Sep 01 2014 00:00:00 GMT+0700 (ICT) 
Tue Sep 30 2014 23:59:59 GMT+0700 (ICT) 

5

Hãy thử mã sau:

const moment=require('moment');
console.log("startDate=>",moment().startOf('month').format("YYYY-DD-MM"));
console.log("endDate=>",moment().endOf('month').format("YYYY-DD-MM"));

1
bạn nên thêm một số ngữ cảnh vào mã của mình để giải thích lý do và cách nó sẽ giải quyết vấn đề
ᴄʀᴏᴢᴇᴛ

3

Đừng thực sự nghĩ rằng có một số phương pháp trực tiếp để có được ngày cuối cùng nhưng bạn có thể làm điều gì đó như sau:

var dateInst = new moment();
/**
 * adding 1 month from the present month and then subtracting 1 day, 
 * So you would get the last day of this month 
 */
dateInst.add(1, 'months').date(1).subtract(1, 'days');
/* printing the last day of this month's date */
console.log(dateInst.format('YYYY MM DD'));

2

Ngày bắt đầu của bạn là ngày đầu tiên của tháng, Trong trường hợp này, chúng tôi có thể sử dụng

var endDate = moment(startDate).add(1, 'months').subtract(1, 'days');

Hi vọng điêu nay co ich!!


0
var d = new moment();
var startMonth = d.clone().startOf('month');
var endMonth = d.clone().endOf('month');
console.log(startMonth, endMonth);

doc


0

const year = 2014;
const month = 09;

// months start at index 0 in momentjs, so we subtract 1
const startDate = moment([year, month - 1, 01]).format("YYYY-MM-DD");

// get the number of days for this month
const daysInMonth = moment(startDate).daysInMonth();

// we are adding the days in this month to the start date (minus the first day)
const endDate = moment(startDate).add(daysInMonth - 1, 'days').format("YYYY-MM-DD");

console.log(`start date: ${startDate}`);
console.log(`end date:   ${endDate}`);
<script
src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js">
</script>


0
const dates = getDatesFromDateRange("2014-05-02", "2018-05-12", "YYYY/MM/DD", 1);           
console.log(dates);
// you get the whole from-to date ranges as per parameters
var onlyStartDates = dates.map(dateObj => dateObj["to"]);
console.log(onlyStartDates);
// moreover, if you want only from dates then you can grab by "map" function

function getDatesFromDateRange( startDate, endDate, format, counter ) {
    startDate = moment(startDate, format);
    endDate = moment(endDate, format);

    let dates = [];
    let fromDate = startDate.clone();
    let toDate = fromDate.clone().add(counter, "month").startOf("month").add(-1, "day");
    do {
        dates.push({
            "from": fromDate.format(format),
            "to": ( toDate < endDate ) ? toDate.format(format) : endDate.format(format)
        });
        fromDate = moment(toDate, format).add(1, "day").clone();
        toDate = fromDate.clone().add(counter, "month").startOf("month").add(-1, "day");
    } while ( fromDate < endDate );
    return dates;
}

Xin lưu ý, .clone () rất cần thiết trong khoảnh khắc nếu không nó sẽ ghi đè giá trị. Có vẻ như trong trường hợp của bạn.

Nó chung chung hơn, để có được một loạt các ngày rơi vào giữa các ngày.


-1

Đoạn mã sau sẽ hoạt động:

$('#reportrange').daterangepicker({
                startDate: start,
                endDate: end,
                ranges: {
                    'Hoy': [moment(), moment()],
                    'Ayer': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                    'Ultimos 7 dias': [moment().subtract(6, 'days'), moment()],
                    'Ultimos 30 dias': [moment().subtract(29, 'days'), moment()],
                    'Mes actual': [moment().startOf('month'), moment().endOf('month')],
                    'Ultimo mes': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
                    'Enero': [moment().month(0).startOf('month') , moment().month(0).endOf('month')],
                    'Febrero': [moment().month(1).startOf('month') , moment().month(1).endOf('month')],
                    'Marzo': [moment().month(2).startOf('month') , moment().month(2).endOf('month')],
                    'Abril': [moment().month(3).startOf('month') , moment().month(3).endOf('month')],
                    'Mayo': [moment().month(4).startOf('month') , moment().month(4).endOf('month')],
                    'Junio': [moment().month(5).startOf('month') , moment().month(5).endOf('month')],
                    'Julio': [moment().month(6).startOf('month') , moment().month(6).endOf('month')],
                    'Agosto': [moment().month(7).startOf('month') , moment().month(7).endOf('month')],
                    'Septiembre': [moment().month(8).startOf('month') , moment().month(8).endOf('month')],
                    'Octubre': [moment().month(9).startOf('month') , moment().month(9).endOf('month')],
                    'Noviembre': [moment().month(10).startOf('month') , moment().month(10).endOf('month')],
                    'Diciembre': [moment().month(11).startOf('month') , moment().month(11).endOf('month')]
                }
            }, cb);

-2

Hãy thử mã sau:

moment(startDate).startOf('months')
moment(startDate).endOf('months')

2
Chào mừng bạn đến với Stack Overflow. Có mười câu trả lời khác cho câu hỏi này; Sẽ rất tốt cho bạn khi giải thích tại sao của bạn tốt hơn hoặc tốt hơn những người khác.
chb

nó không mang lại o / p như mong đợi
Shyam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.