我正在尝试为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));
答案 0 :(得分:1)
你真的不需要图书馆。要在一个日期中添加一个月是非常简单的,从:
开始date.setMonth(date.getMonth() + 1);
这可以保持与日期相关的时间,即使是在夏令时的边界,但可以将日期推迟到下个月结束时,例如在1月31日增加1个月到2月31日到3月2日或3日(取决于它是否是闰年)。
因此需要检查一下,如果日期不相同,那么它会在一个月内滚动,因此将其设置为上个月的最后一天。写成一个函数来添加任意数月:
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;
添加更加容易,请参阅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日。
您的其他问题类似。
无论如何,如果你对使用图书馆感到满意,那很好。只是想我会指出你哪里出错了。
此处您的代码已经过调整,因此会在此处运行,显示错误:
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;
答案 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
引用了从库中生成的日期对象。