如何检查日期是否是假期

时间:2018-11-20 17:22:25

标签: javascript json date

我遇到这种情况,用户可以在其中设置日期和天数,以便我可以通过javascript方法计算截止日期。我找到了一个API,该API返回我所在城市假期的json对象。问题是,当我调用方法传递一个我知道是假日的日期并且该日期存在于json对象中时,该方法返回false。如果我将方法逐行复制并粘贴到chrome的dev工具上,它将返回true。我想念什么?

OBS:在我的国家/地区中使用的日期格式为dd / mm / YYYY,这就是为什么我使用某些日期格式并与json对象中返回的日期进行比较的原因。

function verifyHoliday(date){
  var url = "https://api.calendario.com.br/?json=true&ano=2018&estado=SP&cidade=MOGI_GUACU&token=ZGdvLmRpZWdvY2FydmFsaG9AZ21haWwuY29tJmhhc2g9MTYzMjcxMDY3";
  var day = (date.getDate() < 10) ? "0"+date.getDate() : date.getDate();
  var dateString = day + "/" + (date.getMonth() + 1) + "/" + date.getFullYear();

  //====================================================
  var holiday = false;
  var holidays = [];
  $.getJSON(url, function(data){
    for(var i = 0; i < data.length; i++){
      var obj = {day: data[i].date, name: data[i].name};
      holidays[i] = obj;
    }
  });

  for(var i = 0; i < holidays.length; i++){
    if(holidays[i].day == dateString){
        holiday = true;
        break;
    }
  }
  return feriado;
}

2 个答案:

答案 0 :(得分:0)

请尝试以下代码-请注意“ $ .getJSON(url).then(函数(数据)){}”,而不是原始代码。

正如某人评论的那样,您的问题似乎是由于您在没有实际回复之前使用了回复。因为$ .getJSON是异步的。

function verifyHoliday(date){
    var url = "https://api.calendario.com.br/?json=true&ano=2018&estado=SP&cidade=MOGI_GUACU&token=ZGdvLmRpZWdvY2FydmFsaG9AZ21haWwuY29tJmhhc2g9MTYzMjcxMDY3";
    var day = (date.getDate() < 10) ? "0"+date.getDate() : date.getDate();
    var dateString = day + "/" + (date.getMonth() + 1) + "/" + date.getFullYear();

    //====================================================
    var holiday = false;
    var holidays = [];
    $.getJSON(url).then(function (data) {
      for(var i = 0; i < data.length; i++){
        var obj = {day: data[i].date, name: data[i].name};
        holidays[i] = obj;
      }
    });

    for(var i = 0; i < holidays.length; i++){
      if(holidays[i].day == dateString){
          holiday = true;
          break;
      }
    }
    return feriado;
  }

答案 1 :(得分:0)

您的代码存在一些问题:

  1. 该呼叫是异步的,您无需等待响应
  2. 您将日期格式设置为DD / M / YYYY,因此比较将在个位数月份内失败
  3. 您尚未声明或初始化 feriado ,因此您应该获得参考错误

下面是一个简单的示例,用于测试元旦是否是假期:

var req = new XMLHttpRequest();
req.onload = function(e) {
  var text = req.response;
  var data = JSON.parse(text);
  var holidays = data.map(hol => ({day:hol.date, name:hol.name}));
  var nyd = '01/01/2018';
  console.log(`Is ${nyd} a holiday? ${holidays.some(hol => hol.day == nyd)}`);
}

var url = 'https://api.calendario.com.br/?json=true&ano=2018&estado=SP&cidade=MOGI_GUACU&token=ZGdvLmRpZWdvY2FydmFsaG9AZ21haWwuY29tJmhhc2g9MTYzMjcxMDY3'
req.open('GET', url); // async request
req.responseType = 'text';
req.send();

PS

您只应执行一次请求,并存储结果,因为每次调用 verifyHoliday 时都会运行该结果,效率非常低。假期可能不经常更改(通常提前几年才刊登宪报),因此每天甚至一次就足够了。