这是确定日期范围是否在不到一年的时间内结束的正确方法吗



我正在FreeCodeCamp上完成友好日期范围挑战:)在功能开始之前,基本上有3个条件需要检查:

不要显示冗余或可以推断的信息由用户:如果日期范围结束后不到一年开始,不显示结束年份

但随着我的进一步阅读,下一个条件的措辞似乎令人困惑。

此外,如果日期范围从当前年份开始并结束在一年内,年份不应显示在的开始友好的范围。

最后:

如果范围在开始的同一个月结束,则不显示年末或月末。

所以我在想数组何时传递给函数:

makeFriendlyDates(["2016-07-01", "2016-07-04"])

我会这样做:

var newarr,
newarr1 = arr[0].split('-'), // ['2016', '07', '01']
newarr2 = arr[1].split('-'), // ['2016', '07', '04']
date1 = new Date(newarr1), // Fri Jul 01 2016 00:00:00 GMT-0400 (EDT)
date2 = new Date(newarr2), // Mon Jul 04 2016 00:00:00 GMT-0400 (EDT)
_date1 = new Date(date1); // Fri Jul 01 2016 00:00:00 GMT-0400 (EDT)
date1.setFullYear(date1.getFullYear() + 1); // Sat Jul 01 2017 00:00:00 GMT-0400 (EDT)

更新5/23/2016

我决定把重点放在不起作用的地方和我有困难的地方。

这是我遇到的两个问题:一个是我不确定我的逻辑是否符合要求:

if (date2 < date1) {
newarr2.shift();
if ((date2 < date1) && (date2 < _date1)) {
newarr1.shift();
} else if ((date2.getMonth()) === (date1.getMonth())) {
newarr2.splice(0, 2);
}
}

我不确定我将如何连接拼接中的值,因此格式如下所示:

["July 1st, 2016", "July 4th, 2018"]

基本上,我的问题是我的条件是否正确,以及如何获得所需的正确输出。

function makeFriendlyDates(arr) {
var newarr,
newarr1 = arr[0].split('-'), // ['2016', '07', '01']
newarr2 = arr[1].split('-'), // ['2016', '07', '04']
date1 = new Date(newarr1), // Fri Jul 01 2016 00:00:00 GMT-0400 (EDT)
date2 = new Date(newarr2), // Mon Jul 04 2016 00:00:00 GMT-0400 (EDT)
_date1 = new Date(date1); // Fri Jul 01 2016 00:00:00 GMT-0400 (EDT)
date1.setFullYear(date1.getFullYear() + 1); // Sat Jul 01 2017 00:00:00 GMT-0400 (EDT)
function dateTransMogrifier(arr) {
var newarr = [],
month = function(b) {
var monthName = {
'01': 'January',
'02': 'February',
'03': 'March',
'04': 'April',
'05': 'May',
'06': 'June',
'07': 'July',
'08': 'August',
'09': 'September',
'10': 'October',
'11': 'November',
'12': 'December',
'month': function(mn) {
return this[mn];
}
};
return monthName.month(b);
},
monthDate = function(c) {
c = parseInt(c);
var dateSuffix = {
'st': 'st',
'nd': 'nd',
'rd': 'rd',
'th': 'th',
'date': function(ds) {
return this[ds];
}
};
if (c === 1) {
return c + (dateSuffix.date('st'));
} else if ((c === 2) || (c === 22)) {
return c + (dateSuffix.date('nd'));
} else if ((c === 3) || (c === 23)) {
return c + (dateSuffix.date('rd'));
} else if ((c > 3) || (c < 22) || (c > 24)) {
return c + (dateSuffix.date('th'));
}
};
newarr.push(arr[0]);
newarr.push(month(arr[1]));
newarr.push(monthDate(arr[2]));
return newarr;
}
newarr1 = dateTransMogrifier(newarr1);
newarr2 = dateTransMogrifier(newarr2);
if (date2 < date1) {
newarr2.shift();
if ((date2 < date1) && (date2 < _date1)) {
newarr1.shift();
} else if ((date2.getMonth()) === (date1.getMonth())) {
newarr2.splice(0, 2);
}
}
newarr = newarr1.concat(newarr2);
return newarr;
}
makeFriendlyDates(['2016-07-01', '2016-07-04']);

只需减去两个日期,结果将是以毫秒为单位的差异,您可以将其转换为年:

differenceInMillis = Math.abs(new Date("2016-07-01") - new Date("2017-07-02"));
function millisecondsToYears(millis) {
millisecondsPerYear = 1000 * 60 * 60 * 24 * 365;
return millis/millisecondsPerYear;
}
millisecondsToYears(differenceInMillis) > 1

由于您的日期显示为ISO 8601格式(YYYY-MM-DD),因此您可以简单地使用Date.new直接解析它们。

最新更新