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

时间:2015-10-28 13:59:39

标签: javascript date

我正在开发一个应用程序,其中使用的所有日期都是GMT日期,例如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()

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

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

2 个答案:

答案 0 :(得分:3)

编辑:实际上我发现了一个绝对更好的解决方案。我为了穷举而离开了这个。

问题是function addGMTDays(date, days) { var result = new Date(date); result.setTime(result.getTime() + days * 24 * 3600 * 1000); return result; } 在不更改本地时间的情况下增加了一天。但这意味着GMT时间确实在变化!

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

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"

输出:

<html>
<head>
    <link type="text/css" rel="stylesheet" href="navigation1.css" />
</head>
<body>

    <p id="demo"></p>

    <button onclick="getDaysInMonth()">try it</button>

    <script type="text/javascript">
    var nacht = "nacht";
    var morgen = "morgen";
    var middag = "middag";
    var avond = "avond";

答案 1 :(得分:0)

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

使用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;
}