在不更改GMT时间的情况下为日期添加天数

Add days to a date without changing GMT time

本文关键字:日期 添加 情况下 GMT 时间      更新时间:2023-09-26

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

我正在使用以下功能为日期添加天数:

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

但是,我刚刚意识到,当穿越夏令时转换日时,它不起作用:

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

输出:

"2015-10-24T00:00:00.000Z"
"2015-10-25T00:00:00.000Z"
"2015-10-26T01:00:00.000Z"
             ^
"2015-10-27T01:00:00.000Z"
             ^

请注意,最后两个日期已经不圆了。

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

编辑:实际上我找到了一个肯定更好的解决方案。我离开这里是为了穷尽。

问题是Date.setDate()在不更改本地时间的情况下增加了一天。但这意味着格林尼治标准时间确实改变了!

在不更改GMT时间的情况下添加一天实际上就像在日期的时间上添加24*3600*1000毫秒一样简单:

function addGMTDays(date, days) {
  var result = new Date(date);
  result.setTime(result.getTime() + days * 24 * 3600 * 1000);
  return result;
}

然后:

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

输出:

"2015-10-24T00:00:00.000Z"
"2015-10-25T00:00:00.000Z"
"2015-10-26T00:00:00.000Z"
"2015-10-27T00:00:00.000Z"

问题是Date.setDate()在不更改本地时间的情况下添加了一天。但这意味着格林尼治标准时间确实改变了!

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

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

然后:

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

输出:

"2015-10-24T00:00:00.000Z"
"2015-10-25T00:00:00.000Z"
"2015-10-26T00:00:00.000Z"
"2015-10-27T00:00:00.000Z"

这也将持续数月:

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