简体   繁体   中英

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

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

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)

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

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

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

Eg if you change the last line to this it will be the number 1:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM