【问题标题】:How to convert date values to number of days如何将日期值转换为天数
【发布时间】:2021-01-11 15:38:26
【问题描述】:

我正在尝试为日期添加天数。我从用户那里获取输入,其中每个字段都有单独的输入框,例如 no。几年,没有几个月,没有这样的日子。

正如您在第二个输入字段行中看到的那样,我不接受年、日、月等。 在第一行,我得到了一个合适的日期,例如:2020 10 05 00 00 00 然后将它们传递给日期构造函数以设置日期。

例如。 Date firstdate = new Date(2020, 10, 05, 00, 00,00);

我正在使用以下函数为上述日期添加天数

Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

我通过调用这样的函数将天数添加到前一个日期。 var newdate = firstdate.addDays(totaldays);

现在的问题是,当我计算天数时,它不包括带有指定日期的闰年和月份。因为我是这样计算天数的:

totaldays = (years * 365) + (months * 30) + days;

有什么方法可以完美地添加天数?例如,如果用户输入日期,如

2020 12 10 00 00 00

然后像这样添加天数和年数

1 年 3 个月 0 天 00 00 00

所以理想情况下应该计算 3 个月,即 1 月、2 月、3 月,因为用户输入了 12 月的日期,所以应该添加下三个月的日期。

那么我如何获得完美的天数? 对不起,这个问题可能感觉太长或不合适。但我从一周开始就在做这个。 注意:我不能使用任何外部链接、API、图书馆,因为这是一个学校项目。

任何帮助都会很棒。也对不起我的英语。我不是母语人士。

【问题讨论】:

    标签: javascript html date datetime


    【解决方案1】:

    使用getFullyear/setFullYeargetMonth/setMonthgetDate/setDateDate 对象为您完成。他们处理翻转年和闰年:

    const yearsToAdd = 1;
    const monthsToAdd = 3;
    const daysToAdd = 0;
    
    const date = new Date(2020, 12 - 1, 10);
    console.log(date.toString());
    date.setFullYear(date.getFullYear() + yearsToAdd);
    date.setMonth(date.getMonth() + monthsToAdd);
    date.setDate(date.getDate() + daysToAdd);
    console.log(date.toString());

    作为处理闰年的一个例子,下面的代码将 2020 年 2 月 28 日(这是闰年,所以有 2 月 29 日)加上两天:

    const yearsToAdd = 0;
    const monthsToAdd = 0;
    const daysToAdd = 2;
    
    const date = new Date(2020, 2 - 1, 28);
    console.log(date.toString());
    date.setFullYear(date.getFullYear() + yearsToAdd);
    date.setMonth(date.getMonth() + monthsToAdd);
    date.setDate(date.getDate() + daysToAdd);
    console.log(date.toString());

    注意 3 月 1 日,而不是 2019 年的 3 月 2 日:

    const yearsToAdd = 0;
    const monthsToAdd = 0;
    const daysToAdd = 2;
    
    const date = new Date(2019, 2 - 1, 28);
    console.log(date.toString());
    date.setFullYear(date.getFullYear() + yearsToAdd);
    date.setMonth(date.getMonth() + monthsToAdd);
    date.setDate(date.getDate() + daysToAdd);
    console.log(date.toString());

    【讨论】:

      【解决方案2】:

      这是其他问题的重复:

      1. Add A Year To Today's Date
      2. JavaScript function to add X months to a date
      3. Add days to JavaScript Date

      总结一些问题:

      1. 实行夏令时的日子并不总是 24 小时,因此您必须确定“增加 1 天”是指增加 1 个日历日还是增加 24 小时
      2. 月份为 28 到 31 天,因此添加 1 个月会添加不同的天数,具体取决于您要添加到的月份
      3. 年份是 365 或 366 天。闰年,2 月 29 日加 1 年,366 天,3 月 2 日结束。次日,3 月 1 日加 1 年,3 月 1 日结束

      上面没有提到闰年和月份长度的其他怪癖,例如 8 月 31 日 + 1 个月会得到 10 月 1 日,因为在 8 月添加一个月会增加 31 天。

      因此,您可以添加业务规则来处理怪癖,或者任其发生。

      关于添加年、月和日,可以在一次调用 setFullYear 中完成:

      date.setFullYear(date.getFullYear() + yearsToAdd,
                       date.getMonth() + monthsToAdd,
                       date.getDate() + daysToAdd);
      

      一次添加它们可能与一次添加它们产生不同的结果。

      假设您获取的是年、月、日等的值,然后是要添加的值,您可以简单地添加相应的值(确保在添加之前将字符串转换为数字)并调用 Date 构造函数一次:

      let date = new Date(startYear + yearsToAdd,
                          startMonth - 1 + monthsToAdd, // Assuming user enters calendar month
                          startDay + daysToAdd,
                          startHour + hoursToAdd,
                          startMinute + minutesToAdd,
                          startSecond + secondsToAdd);
      

      【讨论】:

        猜你喜欢
        • 2020-04-24
        • 2018-09-25
        • 1970-01-01
        • 2017-11-26
        • 2020-07-24
        • 1970-01-01
        • 1970-01-01
        • 2014-12-31
        • 1970-01-01
        相关资源
        最近更新 更多