javascript日期操纵怪异

时间:2012-06-13 17:37:55

标签: javascript

我想创建两个日期,其中包含一个月的开始日期和下个月的开始日期。这就是我所拥有的:

var TheMonth = "6.2012"; // as in june 2012
TheMonth = TheMonth.split(".")

var TheDisplayDate = new Date(parseInt(TheMonth[1], 10), (parseInt(TheMonth[0], 10) - 1), 1);

var TheUpperLimit = new Date(TheDisplayDate.getFullYear(), TheDisplayDate.getMonth(), 1);

//I'm adding a month here but it's not changing the month
TheUpperLimit.setMonth(TheUpperLimit.getUTCMonth() + 1);

问题是TheUpperLimit原来是同一个日期。我有一个小提琴here来看。 我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:1)

问题是您使用getUTCMonth代替setMonth代替setUTCMonth。仅使用UTC或仅使用非UTC方法更为正确。当您使用setMonthgetMonth时,它似乎工作正常。但是当你使用这些函数的UTC变体时,它会给你2个jul而不是1个jul(至少在我的时区)。我建议您使用以下代码以避免时间上的并发症:

var TheMonth = "6.2012"; // as in june 2012
TheMonth = TheMonth.split(".");
var month = parseInt(TheMonth[0]);
var year = parseInt(TheMonth[1]);
var second_month = month + 1;
var second_year = year;
if (second_month > 12) {
    second_month = 1;
    second_year++;
}

var TheDisplayDate = new Date(year, month - 1, 1);
var TheUpperLimit = new Date(second_year, second_month - 1, 1);
console.log([TheDisplayDate, TheUpperLimit]);
// => [Date {Fri Jun 01 2012 00:00:00 GMT+0400 (MSK)}, 
//     Date {Sun Jul 01 2012 00:00:00 GMT+0400 (MSK)}]

答案 1 :(得分:1)

根据您的昵称(@frenchie),您当地的时间可能是法国时间。这意味着GMT + 2:00

例如设置时:

new Date(2012,5,1)

这意味着你有:

year=2012, month=June, day=1, hours=minutes=seconds=mseconds=0 

作为GMT + 2:00UTC Date将有-2小时偏移。如果您执行TheUpperLimit.toString(),则会看到您拥有Thu, 31 May 2012 22:00:00 GMT。这意味着,您的UTC Month为'4'。因此,当你添加“+1”时,你将获得“5”月份,那就是六月。所以没有什么是奇怪的。