JavaScript日期,提前30天

时间:2017-03-27 16:42:47

标签: javascript date

我正在尝试为JSON对象设置结束日期。结束日期等于开始日期后30天。有时这会返回正确的日期,有时则不会。

这是GetDateSchedulerFormatted函数

GetDateSchedulerFormatted(date) {
    function pad(s) { return (s < 10) ? '0' + s : s; }
    var d = new Date(date);
    // yyy-MM-dd
    return [pad(d.getDate()), pad(d.getMonth() + 1), d.getFullYear()].join('/') + " " + pad(d.getHours()) + ":" + pad(d.getMinutes());
}

在此示例中,代码返回正确的日期

//activity.startDate = 2017-07-02T00:00:00-08:00
    var startDate = this.GetDateSchedulerFormatted(activity.startDate); //start date 07/02/2017 00:00 d/m/yyy

    var newDate = new Date(startDate); // returns Tue Aug 01 2017 00:00:00 GMT-0700 (Pacific Daylight Time) also 1 day off

    var endDate = this.GetDateSchedulerFormatted(new Date(newDate.setTime(newDate.getTime() + 30 * 86400000))); //returns correct date 01/08/2017 00:00 d/m/yyyy 

在下一个示例中,它返回1年的日期

    //activity.startDate = 2016-12-12T00:00:00-08:00
    var startDate = this.GetDateSchedulerFormatted(activity.startDate); //returns 12/12/2016 00:00 d/m/yyy

    var newDate = new Date(startDate); // returns Wed Jan 11 2017 00:00:00 GMT-0800 1 month ahead

    var endDate = this.GetDateSchedulerFormatted(new Date(newDate.setTime(newDate.getTime() + 30 * 86400000))); //returns 11/01/2017 00:0 d/m/yyy 

在此示例中,返回相同的确切日期

        //activity.startDate = 2017-02-01T00:00:00-08:00
        var startDate = this.GetDateSchedulerFormatted(activity.startDate); //returns 01/02/2017 00:00 d/m/yyy

        var newDate = new Date(startDate); // returns Wed Feb 01 2017 00:00:00 GMT-0800

        var endDate = this.GetDateSchedulerFormatted(new Date(newDate.setTime(newDate.getTime() + 30 * 86400000))); //returns 01/02/2017 00:00 the same date, it's not 30 days ahead

然后在最后一个例子中,我得到NaN / NaN / NaN NaN:NaN

        //activity.startDate = 2017-02-25T00:00:00-08:00
        var startDate = this.GetDateSchedulerFormatted(activity.startDate); //returns 25/02/2017 00:00 d/m/yyy

        var newDate = new Date(startDate); // returns invalid date

        var endDate = this.GetDateSchedulerFormatted(new Date(newDate.setTime(newDate.getTime() + 30 * 86400000))); //returns NaN/NaN/NaN NaN:NaN

我也试过new Date(Date.parse(startDate));

2 个答案:

答案 0 :(得分:1)

你真的不需要图书馆。要在一个日期中添加一个月是非常简单的,从:

开始
date.setMonth(date.getMonth() + 1);

这可以保持与日期相关的时间,即使是在夏令时的边界,但可以将日期推迟到下个月结束时,例如在1月31日增加1个月到2月31日到3月2日或3日(取决于它是否是闰年)。

因此需要检查一下,如果日期不相同,那么它会在一个月内滚动,因此将其设置为上个月的最后一天。写成一个函数来添加任意数月:

&#13;
&#13;
function addMonths(date, months) {
  var d = date.getDate();
  date.setMonth(date.getMonth() + +months);
  if (date.getDate() != d) {
    date.setDate(0);
  }
  return date;
}

// Add 12 months to 29 Feb, 2016
var d = new Date(2016,1,29)
console.log(addMonths(d, 12).toString()); // 28 Feb 2017
&#13;
&#13;
&#13;

添加更加容易,请参阅Add +1 to current date,它很容易适应添加任意天数(这意味着这个问题实际上是重复的)。

所以,回到你的代码。

  

这是GetDateSchedulerFormatted函数

function GetDateSchedulerFormatted(date) {
  function pad(s) {
    return (s < 10) ? '0' + s : s;
  }
  var d = new Date(date);
  // yyy-MM-dd
  return [pad(d.getDate()),
      pad(d.getMonth() + 1),
      d.getFullYear()
    ].join('/') + " " +
    pad(d.getHours()) + ":" +
    pad(d.getMinutes());
}

// In this example the code returns the correct date
var activity = {};
activity.startDate = '2017-07-02T00:00:00-08:00';
var startDate = GetDateSchedulerFormatted(activity.startDate); //start date 07/02/2017 00:00 d/m/yyy

var newDate = new Date(startDate); // returns Tue Aug 01 2017 00:00:00 GMT-0700 (Pacific Daylight Time) also 1 day off

var endDate = GetDateSchedulerFormatted(new Date(newDate.setTime(newDate.getTime() + 30 * 86400000))); //returns
     

正确的日期01/08/2017

您的问题是您从有效的ISO 8601格式字符串开始,&#39; 2017-07-02T00:00:00-08:00&#39;但是然后在你自己的时区重新格式化为你自己的格式(例如&#39; 02/07/2017 00:00&#39;如果你的时区是-0800),然后使用Date构造函数解析它,这是一个非常好的馊主意。它很可能被视为2月7日,所以我不知道如何在7月2日开始时说它返回正确的日期。添加1个月应该是8月2日,而不是8月1日(尽管你确实增加了30天而不是1个月)。最后,如果您越过夏令时边界,您可能会丢失或取消一小时,因此日期可能是前一天的23:00或从00:00到01:00。

请注意:

07/02/2017 00:00 d/m/yyy
                 ^^^^^^^

这不是7月2日,即2月7日。

您的其他问题类似。

无论如何,如果你对使用图书馆感到满意,那很好。只是想我会指出你哪里出错了。

此处您的代码已经过调整,因此会在此处运行,显示错误:

&#13;
&#13;
function GetDateSchedulerFormatted(date) {
  function pad(s) {
    return (s < 10) ? '0' + s : s;
  }
  var d = new Date(date);
  // yyy-MM-dd
  return [pad(d.getDate()),
      pad(d.getMonth() + 1),
      d.getFullYear()
    ].join('/') + " " +
    pad(d.getHours()) + ":" +
    pad(d.getMinutes());
}

// In this example the code returns the correct date
var activity = {};
activity.startDate = '2017-07-02T00:00:00-08:00';
var startDate = GetDateSchedulerFormatted(activity.startDate); //start date 07/02/2017 00:00 d/m/yyy

var newDate = new Date(startDate); // returns Tue Aug 01 2017 00:00:00 GMT-0700 (Pacific Daylight Time) also 1 day off

var endDate = GetDateSchedulerFormatted(new Date(newDate.setTime(newDate.getTime() + 30 * 86400000))); //returns correct date 01/08/2017 00: 00 d / m / yyyy

console.log('activity.startDate: ' + activity.startDate +
  '\nstartDate : ' + startDate +
  '\nnewDate   : ' + GetDateSchedulerFormatted(newDate) +
  '\nendDate   : ' + endDate);

// In this next example it returns the date 1 year off

activity.startDate = '2016-12-12T00:00:00-08:00';
var startDate = GetDateSchedulerFormatted(activity.startDate); //returns 12/12/2016 00:00 d/m/yyy

var newDate = new Date(startDate); // returns Wed Jan 11 2017 00:00:00 GMT-0800 1 month ahead

var endDate = GetDateSchedulerFormatted(new Date(newDate.setTime(newDate.getTime() + 30 * 86400000))); //returns 11/01/2017 00:0 d/m/yyy 
console.log('activity.startDate: ' + activity.startDate +
  '\nstartDate : ' + startDate +
  '\nnewDate   : ' + GetDateSchedulerFormatted(newDate) +
  '\nendDate   : ' + endDate);


// In this example the same exact date is returned


activity.startDate = '2017-02-01T00:00:00-08:00';
var startDate = GetDateSchedulerFormatted(activity.startDate); //returns 01/02/2017 00:00 d/m/yyy

var newDate = new Date(startDate); // returns Wed Feb 01 2017 00:00:00 GMT-0800

var endDate = GetDateSchedulerFormatted(new Date(newDate.setTime(newDate.getTime() + 30 * 86400000))); //returns 01/02/2017 00:00 the same date, it 's not 30 days ahead
console.log('activity.startDate: ' + activity.startDate +
  '\nstartDate : ' + startDate +
  '\nnewDate   : ' + GetDateSchedulerFormatted(newDate) +
  '\nendDate   : ' + endDate);

// Then in this final example I get NaN / NaN / NaN NaN: NaN

activity.startDate = '2017-02-25T00:00:00-08:00';
var startDate = GetDateSchedulerFormatted(activity.startDate); //returns 25/02/2017 00:00 d/m/yyy

var newDate = new Date(startDate); // returns invalid date

var endDate = GetDateSchedulerFormatted(new Date(newDate.setTime(newDate.getTime() + 30 * 86400000))); //returns NaN/NaN/NaN NaN:NaN
console.log('activity.startDate: ' + activity.startDate +
  '\nstartDate : ' + startDate +
  '\nnewDate   : ' + GetDateSchedulerFormatted(newDate) +
  '\nendDate   : ' + endDate);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

感谢Jordan S和zzzzBov的帮助。我决定选择moment.js

我返回正确日期的代码段

var startDate = moment(activity.startDate);
var endDate = moment(activity.startDate);
endDate = endDate.clone().add(1, 'months').calendar();
endDate = moment(endDate);

startDate = startDate._d;
endDate = endDate._d;

moment()函数返回了时刻日期对象。

您必须.clone()要正确添加的对象,.calendar()也会返回不同的格式DD/MM/YYYY

最后变量_d引用了从库中生成的日期对象。