주어진 달의 순간 JS 시작 및 끝


95

연도 = 2014 및 월 = 9 (2014 년 9 월)로 JS 날짜를 계산해야합니다.

나는 이것을 시도했다 :

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

두 로그 모두 다음을 보여줍니다.

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

종료 날짜는 정확하지만 시작 날짜가 아닌 이유는 무엇입니까?

답변:


183

endOf원래 값을 변경 하기 때문 입니다.

관련 인용문 :

시간 단위의 끝으로 설정하여 원래 순간을 변경합니다.

다음은 원하는 출력을 제공하는 예제 함수입니다.

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 };
}

참조 :


4
moment당신은 또한 나무 등 사용할 수 있습니다되도록 endDate = moment(starDate).endOf("month") ^ ^.
감사합니다

1
사실 문서에서 객체를 복제하는 기본 방법은 moment(<value>). 더 짧은 기능 중 일부를 사용하도록 예제를 업데이트했습니다.
klyd 2014 년

1
감사합니다. 나는 그것이 작동하지 않는 이유를 알아 내기 위해 두 시간을 보냈다.
Leon

1
웹에서 멱 등성이라는 단어를 처음 본 적이 있습니다 !! 잘 했어 naomik
Mike

add(-1,"month")1 월에 작동하지 않고 작년 달을 얻고 자합니다.
Akhoy

20

해당 월의 종료일 또는 시작일에 직접 사용할 수 있습니다.

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

새 형식을 정의하여 형식을 변경할 수 있습니다.


16

사용 .endOf()하면 호출되는 오브젝트를 변경하므로 startDate9 월 30 일이됩니다.

.clone()변경하는 대신 사본을 만드는 데 사용해야 합니다.

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

다음 코드를 시도하십시오.

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
당신이 설명하는 코드와 함께 일부 컨텍스트를 추가해야하는 이유와이 문제를 해결하는 방법
ᴄʀᴏᴢᴇᴛ

3

마지막 날을 얻는 직접적인 방법이 있다고 생각하지 않지만 다음과 같이 할 수 있습니다.

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

startDate는 월 1 일입니다.이 경우 다음을 사용할 수 있습니다.

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

도움이 되었기를 바랍니다!!


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

문서


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;
}

.clone ()은 momentjs에서 필수적이며 그렇지 않으면 값을 재정의합니다. 귀하의 경우에 보입니다.

날짜 사이에있는 여러 날짜를 얻는 것이 더 일반적입니다.


-2

다음 코드가 작동합니다.

$('#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

다음 코드를 시도하십시오.

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

2
Stack Overflow에 오신 것을 환영합니다. 이 질문에 대한 10 개의 다른 답이 있습니다. 왜 당신의 것이 다른 것보다 더 낫거나 바람직한 지 설명하는 것이 좋을 것입니다.
chb

예상 O / P를 제공하지 않습니다
Shyam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.