【问题标题】:How to check if a date is a holiday如何检查日期是否为假期
【发布时间】:2018-11-20 17:22:24
【问题描述】:

我有这种情况,用户设置日期和天数的表单,因此我可以通过 javascript 方法计算截止日期。我找到了一个 api,它在我所在城市的假期中返回 json 对象。问题是,当我调用我的方法传递一个我知道是假期并且它存在于 json 对象中的日期时,该方法返回 false。如果我在 chrome 的开发工具上逐行复制并粘贴该方法,它会返回 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;
}

【问题讨论】:

  • $.getJSON 是异步的,这意味着在执行迭代它的代码之后填充假期数组。查看重复的问题,这是一个非常常见的问题
  • 尝试在页面加载后立即加载包含假期的完整数组,例如使用 document.onload。
  • 您正在填充日期而不是月份,因此您将得到一个类似于“01/1/2019”的日期。此外,您正在设置 holiday 的值,但返回 feriado

标签: javascript json date


【解决方案1】:

请改用以下代码 - 请注意“$.getJSON(url).then(function (data)) {}”而不是您的原始代码。

正如有人评论的那样,您的问题似乎是由于您在没有实际响应之前使用了响应。因为 $.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;
  }

【讨论】:

  • 它仍然返回 false...我尝试了一个假日日期(10 月 12 日),它返回 false。
  • 这应该会抛出一个引用错误:can't find feriado.
【解决方案2】:

您的代码存在一些问题:

  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 时运行它是非常低效的。假期可能不会经常变化(通常会提前几年在宪报上公布),所以即使每天一次也绰绰有余。

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多