javascript - 这是确定日期范围是否在 Javascript 中从开始日期到一年以内结束的正确方法吗?

标签 javascript date

我正在处理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/

相关文章:

javascript - AngularJS ng-grid 过滤器 -- filterText 格式

javascript - 向数组中插入满足条件的元素

java - 如何将 "9:00 PM EST"转换为 Date 对象

c - 我正在尝试根据给定的出生日期和 c 中的当前日期计算年龄

C++ - 如何获取特定时区的日期

Sqlite DateTime 无法识别 Java 当前日期时间

javascript - 使用 jQuery 对表行重新排序,但排除嵌套表

javascript - d3.js - 以缩写形式在轴上显示大数字

mysql - 如何将 CONTAINS 与 CURDATE 一起使用?

javascript - 使用 ng-include 的最简单方法