如何将日期值转换为天数

时间:2021-01-11 15:38:26

标签: javascript html date datetime

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

正如您在第二个输入字段行中看到的,我不接受年、日、月等。 在第一行,我得到了一个正确的日期,例如: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 月的日期,因此应添加下三个月的日期。

SO 如何获得完美的天数? 抱歉,这个问题可能感觉太长或不合适。但我从一个星期开始研究这个。 注意:我不能使用任何外部链接、API、图书馆,因为这是一个学校项目。

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

2 个答案:

答案 0 :(得分:1)

通过使用 Date/getFullyearsetFullYear/getMonthsetMonth/{ 让 getDate 对象为您完成{1}}。他们处理翻转和闰年:

setDate

作为处理闰年的一个例子,这里的代码在 2020 年 2 月 28 日(这是一个闰年,所以有一个 2 月 29 日)增加了两天:

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());

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

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());

答案 1 :(得分:0)

这是其他问题的重复:

  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);