【发布时间】:2014-05-29 03:43:39
【问题描述】:
我有一个函数,我从开始日期和月份(任期)计算结束日期。
前任。我有开始日期2014-05-05 并添加 1 个月,然后它应该显示2014-06-05。这对我来说是正确的。
但是如果我添加2014-02-01 那么它显示2014-03-01 这是错误的。它应该显示2014-02-28。
以下是我的功能:
function getEndDate() {
var start_date = $("#start_date").val();
var tenure = $("#tenure").val();
if (/^\d{4}\-\d{2}\-\d{2}$/i.test(start_date)) {
var parts = start_date.split("-");
var year = parts[0] && parseInt(parts[0], 10);
var month = parts[1] && parseInt(parts[1], 10);
var day = parts[2] && parseInt(parts[2], 10);
var duration = parseInt(tenure, 10);
if (day <= 31 && day >= 1 && month <= 12 && month >= 1) {
var expiryDate = new Date(year, month+duration, day);
expiryDate.setFullYear(expiryDate.getFullYear());
day = ('0' + expiryDate.getDate()).slice(-2);
month = ('0' + (expiryDate.getMonth())).slice(-2);
year = expiryDate.getFullYear();
$("#end_date").val(year + "-" + month + "-" + day);
} else {
// display error message
}
}
}
请告诉我哪里出错了。
【问题讨论】:
-
除非您这样做是为了学习,否则您可能需要查看 moment 库。 momentjs.com 它内置了所有的日期信息,而且你可以看到他们是如何计算它的。
-
我不明白你的用例。如果将一个月添加到 2014-05-05 应该正确地产生 2014-06-05,那么对我来说,在逻辑上添加一个月到 2014-02-01 应该正确地产生 2014-03-01。如果您要说“一个月前的一天”(在后一种情况下确实是 2014-02-28),那么前一种情况应该产生 2014-06-04,而不是 2014-06-05。
-
@Paul:它应该知道特定月份的日期。例如。 2 月只有 28 或 29 天。
-
我在 .NET 中运行了您的模拟,只是为了看看它会返回什么,它在您的第二个用例中显示 2014 年 3 月 1 日。 dotnetfiddle.net/gdvROt 然后我使用同样计算 2014 年 3 月 1 日的 momentjs 库运行它。 plnkr.co/edit/c0Gfqi6c7pSMkXTaSUZS?p=preview
-
我更新了我的帖子。请检查
标签: javascript jquery date