我正在尝试为日期添加天数。我正在从用户那里获取输入,其中每个字段都有单独的输入框,例如 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 月的日期,因此应添加下三个月的日期。
SO 如何获得完美的天数? 抱歉,这个问题可能感觉太长或不合适。但我从一个星期开始研究这个。 注意:我不能使用任何外部链接、API、图书馆,因为这是一个学校项目。
任何帮助都会很棒。也对不起我的英语。我不是母语人士。
答案 0 :(得分:1)
通过使用 Date
/getFullyear
、setFullYear
/getMonth
和 setMonth
/{ 让 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)
这是其他问题的重复:
总结一些问题:
上面没有提到闰年和月份长度的其他怪癖,例如 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);