在不更改GMT时间的情况下将日期添加到日期

yan*_*976 5 javascript date

我正在开发一个应用程序,其中使用的所有日期都是GMT日期,例如2015-10-29T00:00:00.000Z.

我正在使用以下功能将日期添加到日期:

function addDays(date, days) {
  var result = new Date(date);
  result.setDate(result.getDate() + days);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

但是,我刚刚意识到在穿越夏令时更改日时它不起作用:

var myDate = new Date('2015-10-24T00:00:00.000Z');
for(i = 0; i<4; i++) {
  console.log(JSON.stringify(myDate));
  myDate = addDays(myDate, 1);
}
Run Code Online (Sandbox Code Playgroud)

输出:

"2015-10-24T00:00:00.000Z"
"2015-10-25T00:00:00.000Z"
"2015-10-26T01:00:00.000Z"
             ^
"2015-10-27T01:00:00.000Z"
             ^
Run Code Online (Sandbox Code Playgroud)

请注意,最后两个日期不再是圆形.

处理这个问题的正确方法是什么?

yan*_*976 2

问题是在不改变当地时间Date.setDate()的情况下增加了一天。但这意味着 GMT 时间确实会改变!

使用Date.setUTCDate()解决了问题:

function addUTCDays(date, days) {
  var result = new Date(date);
  result.setUTCDate(result.getUTCDate() + days);
  //        ^^^               ^^^
  return result;
}
Run Code Online (Sandbox Code Playgroud)

然后 :

var myDate = new Date('2015-10-24T00:00:00.000Z');
for(i = 0; i<4; i++) {
  console.log(JSON.stringify(myDate));
  myDate = addUTCDays(myDate, 1);
}
Run Code Online (Sandbox Code Playgroud)

输出这个:

"2015-10-24T00:00:00.000Z"
"2015-10-25T00:00:00.000Z"
"2015-10-26T00:00:00.000Z"
"2015-10-27T00:00:00.000Z"
Run Code Online (Sandbox Code Playgroud)

这也将持续数月:

function addMonths(date, months) {
  var result = new Date(date);
  result.setUTCMonth(result.getUTCMonth() + months);
  return result;
}
Run Code Online (Sandbox Code Playgroud)