我正在处理Friendly Date Ranges FreeCodeCamp 上的挑战:) 在函数开始之前,本质上应该检查 3 个条件:
Do not display information that is redundant or that can be inferred by the user: if the date range ends in less than a year from when it begins, do not display the ending year.
但是当我进一步阅读时,下一个条件的措辞似乎令人困惑。
Additionally, if the date range begins in the current year and ends within one year, the year should not be displayed at the beginning of the friendly range.
最后:
If the range ends in the same month that it begins, do not display the ending year or month.
所以我在想当数组传递给函数时:
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)
更新 2016 年 5 月 23 日
我决定将其结合起来,将焦点缩小到不起作用的地方和我遇到困难的地方。
这是我遇到的两个问题: 一是我不确定我的逻辑是否符合要求:
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
直接解析它们。
关于javascript - 这是确定日期范围是否在 Javascript 中从开始日期到一年以内结束的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37369635/