hally9k
hally9k

Reputation: 2583

Why does a call to Javascript's Date library such as date.setMonth(date.getMonth()-1) return 1426456040720 here?

Why does a call to Javascript's Date library such as date.setMonth(date.getMonth()-1) return 1426456040720 here?

I expect you may get different numbers due to the timezone and culture.

I feel like I must be missing something, I'm sure this is how I've always decremented a month.

Here is a codepen:

http://codepen.io/hally9k/pen/pvMxBP?editors=101

var thisMonth = new Date();

console.log('this month: ' + thisMonth);

var lastMonth = thisMonth.setMonth(thisMonth.getMonth() - 1);

console.log('last month: ' + lastMonth); 

Upvotes: 4

Views: 642

Answers (5)

Mihai Alex
Mihai Alex

Reputation: 678

Construct a new Date:

var lastMonth = new Date(thisMonth.setMonth(thisMonth.getMonth() - 1));

setMonth() returns a number that represents milliseconds since 01 January, 1970 UTC. Using new Date will transform that number in a Date format.

You can use lastMonth.getMonth() to get the month, but if you want it for display purposes take in consideration that getMonth() returns from 0 to 11. (0 is January).

Upvotes: 1

James G.
James G.

Reputation: 2904

DateTime.setMonth returns the unix timestamp of the month being set and changes the value of the DateTime object it is called on.

E.g. if you change the last line to this it will be the number 1:

console.log('last month: ' + thisMonth.getMonth()); 

Upvotes: 0

jfriend00
jfriend00

Reputation: 707706

The return value from .setMonth() is the ms since epoch of the date object. You can see that intended return value in the ECMAScript specification here.

.setMonth() modifies its Date object. You can obtain the new month value from that object with .getMonth() if you want the new month value.

If you just want the new month after you've changed it, you can do this:

var d = new Date();
console.log('this month: ' + d.getMonth());
d.setMonth(d.getMonth() - 1);
console.log('previous month: ' + d.getMonth()); 

Upvotes: 5

Donald
Donald

Reputation: 1200

The issue may be related to the fact that this solution could contain errors in edge cases, such as the 31st day of a month or leap years. As per this StackOverflow question, you would want your code from the CodePen to look something like this:

var thisMonth = new Date();

$('#date').html(thisMonth);

var currentMonth = thisMonth.getMonth();
thisMonth.setMonth(thisMonth.getMonth() - 1);

if (thisMonth.getMonth() != ((currentMonth - 1) % 12)) {
  thisMonth.setDate(0);
}

$('#prevDate').html(thisMonth); 

Upvotes: 1

Omar Elawady
Omar Elawady

Reputation: 3360

thisMonth.setMonth sets the month to thisMonth and return the new date with milli seconds.

so you have 2 choices.

  1. to print thisMonth
  2. print new Date(lastMonth)

Upvotes: 1

Related Questions