Найти разницу между датами в Javascript (Yui Calendar) - PullRequest
0 голосов
/ 21 июля 2011

Я работал с OrangeHRM над проектом.Он использует календарь Yui.Я работал над модулем отпуска.Модуль «Отпуск» позволяет пользователю выбрать «От и до» - период времени, на который он хочет применить отпуск!

Я хочу показать количество рабочих дней после того, как пользователь выбрал даты.Простое вычитание не будет работать, потому что я хочу исключить субботу и воскресенье из уравнений, поскольку они не считаются рабочими днями!

function fillToDate(frmLeaveApp) {

    var fromdate = frmLeaveApp.elements['txtLeaveFromDate'];
        var todate = frmLeaveApp.elements['txtLeaveToDate'];
            var result = frmLeaveApp.elements['txtLeaveTotalDay'];

     if(!fromdate || !todate || !result) {
        return;
    }

        var a = fromdate.value;
        var b = todate.value;

        var c = a.split('-');
        var d = b.split('-');

        var ac = new Date();
        ac.setFullYear(c[2], c[1], c[0]);
        var bd = new Date();
        bd.setFullYear(d[2], d[1], d[0]);

        result.value = (bd.getTime() - ac.getTime()) / (60*60*24*1000);
}

Как мне это сделать?Заранее спасибо !

Ответы [ 3 ]

0 голосов
/ 21 июля 2011

Простое решение не так уж и здорово:)

В календаре YUI ячейка с выбранной датой имеет класс selected.

В субботней ячейке есть «wd6», а в воскресенье - «wd0».

Получить все ячейки, у которых есть «выбранный» класс, отфильтровать и удалить ячейки, у которых есть классы «wd6» и «w0».

var cells = Y.one("#calContainer").all('.selected');
var res = 0;

for (var i = 0, i < cells.length; i++) {
      if (!cells[i].hasClass('.wd6') || !cells[i].hasClass('.wd0')) res++;
    }

return res;

Я не проверял этот код.

0 голосов
/ 22 июля 2011

Здесь есть несколько вещей.Во-первых, чтобы получить количество дней между двумя датами намного эффективнее, чем уже предлагалось:

/*
   Get the number of days between two dates - not inclusive.

   "between" does not include the start date, so days
   between Thursday and Friday is one, Thursday to Saturday
   is two, and so on. Between Friday and the following Friday is 7.

   e.g. getDaysBetweenDates( 22-Jul-2011, 29-jul-2011) => 7.

   If want inclusive dates (e.g. leave from 1/1/2011 to 30/1/2011),
   use date prior to start date (i.e. 31/12/2010 to 30/1/2011).

   Only calculates whole days.
*/
function getDaysBetweenDates(d0, d1) {

  var msPerDay = 8.64e7;

  // Copy dates so don't mess them up
  var x0 = new Date(d0);
  var x1 = new Date(d1);

  // Set to noon - avoid DST errors
  x0.setHours(12,0,0);
  x1.setHours(12,0,0);


  // Round to remove daylight saving errors
  return Math.round( (x1 - x0) / msPerDay );
}

Чтобы получить количество «рабочих» дней, определите количество целых недель, умножьте на 5, затемнастроить на оставшиеся дни и выходные в начале и в конце.Если вы хотите включить дату начала (типично для отпуска), используйте дату начала за один день до назначенной даты.например, заявление на отпуск с пн 4 июля 2011 года по пт 8 июля 2011 года составляет 5 дней отпуска.

С другой стороны, 5 рабочих дней с Пн 4 июля-2011 - это обычно следующий понедельник, 11 июля 2011 года, но может быть COB в пятницу 8 июля 2011 года.Правила для таких вещей могут быть разными в зависимости от местного обычая, юридического прецедента, договорного соглашения и т. Д.

Кроме того, такие простые алгоритмы в любом случае редко бывают достаточными.В праздничные дни все портится, как и в разные рабочие недели в разных местах.Некоторые из них с субботы по среду - четверг и пятница - выходные дни.В других местах суббота - рабочий день (6 дней в неделю).Кроме того, выходные дни могут приходиться на выходные дни.

/* 
   Simple algorithm: each week has 5 business days: Monday
   to Friday inclusive. Saturday and Sunday are non-working
   days.
*/

function getBusinessDaysBetweenDates(d0, d1) {
  var days = getDaysBetweenDates(d0, d1);
  var bWeeks = (days/7)|0;
  var rDays = days%7;
  var startDay = d0.getDay();
  var endDay   = d1.getDay();

  // If not whole weeks, adjust for weekends
  if (rDays) {

    // Adjust for start on weekend, end any day
    if (startDay == 6) {
      rDays -= 1;
    } else if(startDay == 5) {
      rDays -= (rDays == 1)? 1 : 2;

    // Adjust for start on business day
    // and end on weekend
    } else if (endDay == 6) {
      rDays -= 1;

    // Adjust for going over whole weekend
    } else if (endDay < startDay) {
      rDays -= (rDays == 1)? 1 : 2;
    }
  }
  return bWeeks * 5 + rDays;
}

Если вы хотите включить праздничные дни, приходящиеся на дни с понедельника по пятницу, вам понадобится другая функция, которая использует календарь выходных дней и возвращаетмногие попадают в рабочие дни между тематическими датами.Также могут быть праздники для определенных отраслей, профессий, религий и т. Д.

0 голосов
/ 21 июля 2011

Не очень горжусь этим решением - должно быть более элегантными способами, но оно должно работать - еще не обрабатывает национальные праздники

Демо здесь

function fillToDate(frmLeaveApp) {

    var fromdate = frmLeaveApp.elements['txtLeaveFromDate'];
    var todate = frmLeaveApp.elements['txtLeaveToDate'];
    var result = frmLeaveApp.elements['txtLeaveTotalDay'];

    if(!fromdate || !todate || !result) {
        return;
    }

    var from = new Date(fromdate.value.replace(/\-/g,"/"));
    var to = new Date(todate.value.replace(/\-/g,"/"));

    // brute force seems the quickest to find
    var res = 0;
    var aDay = 24*60*60*1000;
    for (var i = from.getTime(), n=to.getTime();i < n; i+=aDay) {
      var d = new Date(i).getDay();
      if (d!=0 && d !=6) res++;
    }
    result.value = res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...