给定月份的开始和结束时刻

我需要计算一个 JS 日期,年 = 2014,月 = 9(2014年9月)。

我试过了:

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)

结束日期是正确的,但是... 为什么开始日期不正确?

204741 次浏览

That's because endOf mutates the original value.

Relevant quote:

Mutates the original moment by setting it to the end of a unit of time.

Here's an example function that gives you the output you want:

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

References:

When you use .endOf() you are mutating the object it's called on, so startDate becomes Sep 30

You should use .clone() to make a copy of it instead of changing it

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)

Don't really think there is some direct method to get the last day but you could do something like this:

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

your startDate is first-day-of-month, In this case we can use

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

Hope this helps!!

you can use this directly for the end or start date of the month

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

you can change the format by defining a new format

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

doc

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>

The following code should work:

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

Try the following code:

const moment=require('moment');
console.log("startDate=>",moment().startOf('month').format("YYYY-DD-MM"));
console.log("endDate=>",moment().endOf('month').format("YYYY-DD-MM"));
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;
}

Please note, .clone() is essential in momentjs else it'll override the value. It seems in your case.

It's more generic, to get bunch of dates that fall between dates.

Try the following code:

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

Here is a concise & exact answer:

  // month in moment is 0 based, so 0 is actually january, subtract 1 to compensate.
var startDate = moment([year, month - 1]).format()
var endDate = moment(startDate).clone().endOf('month').format()

Example

let month = 1         // January
let year = 2021


var startDate = moment([year, month - 1]).format()


var endDate = moment(startDate).clone().endOf('month').format()


console.log(startDate)
//2021-01-01T00:00:00-07:00


console.log(endDate)
//2021-01-31T23:59:59-07:00