首页 > 解决方案 > 在 Javascript 中比较完整日历中的日期

问题描述

我正在尝试在 Javascript 中检查日历(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');
            }
        },

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

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

标签: javascriptfullcalendar

解决方案


您应该强制使用+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之前的任何内容

即:check= 05-29-2020 23:59:999 < today=05-29-2020 22:00:000 === false(不是过去)
或者换句话说,实际意图是:
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'})


推荐阅读