Moment JS start and end of given month

JavascriptMomentjs

Javascript Problem Overview


I need to calculate a JS date given year=2014 and month=9 (September 2014).

I tried this:

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

Both of logs show:

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

End date is correct but... why the start date is not?

Javascript Solutions


Solution 1 - Javascript

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:

Solution 2 - Javascript

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

Solution 3 - Javascript

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) 

Solution 4 - Javascript

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

Solution 5 - Javascript

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

Solution 6 - Javascript

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!!

Solution 7 - Javascript

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

doc

Solution 8 - Javascript

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>

Solution 9 - Javascript

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.

Solution 10 - Javascript

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 

Solution 11 - Javascript

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

Solution 12 - Javascript

Try the following code:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFabio B.View Question on Stackoverflow
Solution 1 - JavascriptklydView Answer on Stackoverflow
Solution 2 - JavascriptShakti JadonView Answer on Stackoverflow
Solution 3 - JavascriptbakkalView Answer on Stackoverflow
Solution 4 - JavascriptSanjay SinghView Answer on Stackoverflow
Solution 5 - JavascriptSandeep GantaitView Answer on Stackoverflow
Solution 6 - JavascriptnikhilView Answer on Stackoverflow
Solution 7 - JavascriptIfThenElseView Answer on Stackoverflow
Solution 8 - JavascriptJSON C11View Answer on Stackoverflow
Solution 9 - Javascriptbharat patelView Answer on Stackoverflow
Solution 10 - JavascriptIbad ShaikhView Answer on Stackoverflow
Solution 11 - Javascriptenrique ramosView Answer on Stackoverflow
Solution 12 - JavascriptsacmiiView Answer on Stackoverflow