【问题标题】:Comparing dates in Javascript for fullcalendar [duplicate]在Javascript中比较完整日历的日期[重复]
【发布时间】:2020-09-17 15:52:30
【问题描述】:

我正在尝试检查日历 (fullcalendar) 中的日期,本质上我只是希望它无法选择过去的日期:

        dateClick: function(info) {
            var today = Date.now();
            var check = new Date(info.dateStr)

            if(check < today)
            {
                alert('You cannot request dates in the past');
                return;
            }
            else
            {
                alert('this is the future');
            }
        },

我得到了一些奇怪的结果,它似乎可以计算过去的罚款,但也可以将当前日期计算为过去 AS 和明天。后天计算为未来。不知道发生了什么。

info.dateStr 给出格式 YYYY-mm-dd。

【问题讨论】:

  • 也许您今天需要转换为 yymmdd。也 gmt 可能会干扰

标签: javascript fullcalendar


【解决方案1】:

您想像这样比较日期:date1.getTime() - date2.getTime()

另外,请记住,如果您的目标是确保用户输入的日期不是过去的日期,您可以使用带有最小值的 html5 日期输入:

<input type="date" min="2020-05-29">

【讨论】:

    【解决方案2】:

    您应该使用+Date 强制编号或使用.getTime() 以确保您正在比较数字时间戳值。你可能没问题,因为你使用的是 Date.now(),它返回一个时间戳。

    由于类似 OP 中的问题,强烈建议不要使用字符串解析 Date 进行解析:
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date

    通过手动解析字符串来使用 Date(yyyy, mm, dd, ...) 构造函数(使用本地时区),而不是内置日期字符串解析(如果未提供时区,则使用 UTC)。
    通过将 24*60*60*1000 添加到 getTime() 值来使用一天结束,因为这很可能是您所期望的(与过去相同的日期并不是大多数人通常想要的)。
    例如:检查日期为 05-29-2020,您实际上想要在 05-29-2020 23:59:999 之前的任何内容

    ie: check=05-29-2020 23:59:999 或者换句话说,实际意图是:
    05-29-2020 => 从 05-29-2020 00:00 到 05-29-2020 23:59 => 实际上与检查 05-30-2020 00:00 - 1 毫秒相同

    dateClick = function(info) {
    
            var today = Date.now()
            var check = (([y,m,d])=>new Date(+y,+m-1,+d))(info.dateStr.split(/\D/)).getTime()
               + 24*60*60*1000-1  // add full day so same date as today is not past
            console.log(today,check)
            
    
            if(check < today)
            {
                alert('You cannot request dates in the past');
                return;
            }
            else
            {
                alert('this is the future');
            }
        }
        dateClick({dateStr:'2020-05-28'})
        dateClick({dateStr:'2020-05-29'})
        dateClick({dateStr:'2020-05-30'})
        dateClick({dateStr:'2020-05-31'})

    【讨论】:

    • 您是否有任何理由不想将所有代码替换为:if(check.getTime() &lt; today.getTime())
    • 2 个问题:UTC 问题,以及对白天任何时间匹配的预期。因此,例如,如果我的本地时间偏移日期与 UTC 时间的日期不同,则使用的日期将提前一天或一天​​后,如果我接近一天的开始或结束。另一个问题是我最后提到的问题。当人们说 05-29-2020 时,他们通常的意思是,如果今天是 05-29-2020 08:00,那么从 05-29-2020 00:00 到 05-29-2020 23:59 之间的任何时间也应该过去
    • 所以想要的实际意图(如 OP 所述,通常是大多数人的意思)是给定 05-29-2020 => 应该允许从 05-29-2020 00:00 到 05 -29-2020 23:59 => 实际上与检查 05-29-2020 23:59:59 或 05-30-2020 00:00:00 相同
    • today.getTime() 也会失败。 Date.now() 是一个数字时间戳。我一开始也做了这个修复,但这不是他遇到的问题。
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多