【问题标题】:JavaScript validate date and return last available date of calendarJavaScript 验证日期并返回日历的最后可用日期
【发布时间】:2017-03-17 07:18:14
【问题描述】:

如果日历中没有日期,我想验证我的日期,然后返回日历的最后可用日期,

示例 01

Input Date    : 31-Feb-2017 
Return Result : 28-Feb-2017

示例 02

Input Date    : 31-March-2017
Return Result : 31-March-2017

示例 03

Input Date    : 31-Apr-2017
Return Result : 30-Apr-2017

示例 04

Input Date    : 31-Jun-2017
Return Result : 30-Jun-2017

以叶年为例 05

Input Date    : 31-Feb-2020 
Return Result : 29-Feb-2020

这是我第一次尝试使用以下函数验证日期,我如何为上述日期制定逻辑。

function isValidDate(year, month, day) {
    var d = new Date(year, month, day);
    if (d.getFullYear() == year && d.getMonth() == month && d.getDate() == day) {
        return true;
    }
    return false;
}

【问题讨论】:

  • 给定代码您面临的问题是什么?
  • @Rajesh,问题是我怎样才能回到日历的最后一个可用日期
  • 算法是,如果不是有效日期,则返回new Date(year, month+1, 0),这将返回月的最后一天。

标签: javascript jquery date


【解决方案1】:

当月的最后一天由下个月的零日给出,所以:

function getDate(year, month, day) {
    var d = new Date(year, month, day);
    if (d.getMonth() == month) {
        return d;
    }
    return new Date(year, +month + 1, 0);
}

console.log(getDate(2017,1,29).toString());
console.log(getDate(2017,0,32).toString());

顺便说一句,要测试有效日期,您只需要测试月份,因为如果月份大于一年中的月份,它将同时影响月份和年份。如果天数大于该月的天数,它也会影响该月。对年份没有任何影响(除非您通过的年份小于 100,在这种情况下,它被视为 1900 + 年)。

【讨论】:

  • 当月份为一月时这将失效,请参阅答案应为 2017 年 1 月 31 日而不是 2017 年 2 月 28 日
  • @KapilaPerera——不,它没有。 OP 直接调用日期构造函数,所以getDate(2017,1,29) 是 2 月 29 日,应该返回 2 月 28 日。
【解决方案2】:

你可以试试这样的:

按照spec的解释:

当我们调用带有 2 个或更多参数的日期构造函数时,它会尝试使用以下构造函数进行处理 ref:

new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )

这里如果有任何值没有传递,将被设置为NaN,稍后将被解析为+0。因此时间戳为0:0:0

现在诀窍在于内部调用的函数:MakeDay。

正如你看到的第 8 点,它返回

Day(t) + dt − 1

这里Day(t) 将返回毫秒数,日期将根据dt - 1 计算。由于我们传递的是0,日期值将是-1 + milliseconds,因此它返回前一天。

另一种替代方法是创建下个月 1 日的日期并减去 1 为 day 或 sec。您可以根据需要选择任何人,

function isValidDate(year, month, day) {
  var d = new Date(year, month, day);
  return !!(d.getFullYear() == year && d.getMonth() == month && d.getDate() == day)
}

function computeLastPossibleDate(y,m,d){
  return new Date(y, m+1, 0);
}

function test(y,m,d){
  return isValidDate(y,m,d) ? new Date(y,m,d) : computeLastPossibleDate(y,m,d)
}

// 31st Feb.
console.log(test(2017, 1, 31).toString())
// 31st March
console.log(test(2017, 2, 31).toString())
// 31st April
console.log(test(2017, 3, 31).toString())
// 50th Dec.
console.log(test(2017, 11, 50).toString())

注意:如果有任何遗漏,请将其作为评论与您的​​投票分享。只投票而不发表评论对任何人都没有帮助。

【讨论】:

  • 不是我的反对意见,但一个好的答案应该包括解释它如何解决 OP 的问题。
  • 感谢您的指出。在您添加答案后,我打算删除,但我怀疑报复投票并因此保留它。我会尝试添加解释,并确保它为您的解释添加更多内容。 :-)
  • @RobG 我试图解释。希望它不会重复您的解释。也请指出任何不一致之处。我不确定Day(t),但我想它会产生1/msPerDay。谢谢:-)
  • 看起来不错。请注意,当前规范是 ECMAScript 2016,很快就会被 ECMAScript 2017 取代(这是一个草案,尽管它没有这么说)。 ;-)
  • @RobG 我认为它不会改变太多特别的内部处理,因为它会向后兼容。仍然会检查任何差异并更新我的答案。
【解决方案3】:
function isValidDate(year, month, day) {
    var d = new Date(year, month, day);
    if (d.getFullYear() == year && d.getMonth() == month && d.getDate() == day) {
        return d;
    }
    else
        rturn new Date(year, month, 0);;
}

【讨论】:

    【解决方案4】:
      function isValidDate(year, month, day) {
        if(month<=12){
    
            var temp_day=day;
            var d = new Date(year, month, day);
            var lastDay = new Date(d.getFullYear(), d.getMonth(),0);
            var getlastday=lastDay.getDate();
            if(getlastday<=day){
                //var date=(d.getDate())+"/"+(d.getMonth())+"/"+(d.getFullYear());
                var date=(getlastday)+"-"+(month)+"-"+(lastDay.getFullYear());
                return date;
            }else{
                //var date=(lastDay.getDate())+"-"+(lastDay.getMonth())+"-"+(lastDay.getFullYear());
                var date=(day)+"/"+(month)+"/"+(year);
                return date;
            }
        }
        else{
            return "month not valid";
        }
    }
    

    试试这个代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多