2011-07-21 4 views
0

私はプロジェクトのためにOrangeHRMを使っています。 Yuiカレンダーを使用します。私は休暇のモジュールに取り組んできました。 Leaveモジュールを使用すると、FromとTo Date - 休暇を適用したい時間枠を選択できます。Javascriptの日付の違いを見つける(Yui Calendar)

ユーザーが日付を選択すると、作業日数が表示されます。私は土曜日と日曜日を方程式から除外したいので、単純減算ステートメントは機能しません。

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); 
} 

どうすればよいですか?前もって感謝します !このソリューションの

+1

祝祭日はどうですか? – RobG

+0

@RobG - はい - 公休日もあります。 –

+0

ここで:http:// stackoverflow。com/questions/59934/national-holiday-web-service – mplungjan

答えて

0

スーパー誇りを持っていません - よりエレガントな方法でなければならないが、それが動作するはずです - 国民の休日はまだ

Demo here

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; 
} 
+0

これはちょっとした変更で完璧に機能しました。いくつかの奇妙な理由のために - 私は土曜日と日曜日の値2と3を使用しなければならなかった 何か考えてみませんか? –

+0

いいえ、そうした場合、コードまたは日付に問題があります。私はyyyy/mm/ddと仮定した。 0は日曜日、6は土曜日です – mplungjan

+0

アップデートを参照してくださいhttp://jsfiddle.net/mplungjan/W4fa2/ – mplungjan

0

:)

その偉大ではないシンプルなソリューションを処理しません

YUIカレンダーでは、選択した日付セルに「選択」クラスがあります。

土曜日のセルには「wd6」があり、日曜日には「wd0」クラスがあります。

'selected'クラスを持つすべてのセルを取得し、 '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

興味深い解決策 – mplungjan

0

ここにはいくつかのものがあります。まず、はるかに効率的にすでに提供さよりも、2つの日付の間の日数を取得する:

/* 
    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を掛け、全体の週の数をうまく、「ビジネス」の日数を取得するには残りの日と週末は開始時と終了時である。開始日(休暇の典型的なもの)を含める場合は、指定日の1日前に開始日を使用します。例えば2011年7月4日から2011年7月8日までの休暇申請は、5日間の休暇です。一方

、5営業日から月4月 - 2011は、通常、次の月曜日、11月-2011ですが、金曜の8月 - 2011 COBかもしれません。そのようなもののルールは、地域の慣習、法的判例、契約の合意などによって異なる場合があります。

また、このような単純なアルゴリズムではほとんどの場合十分ではありません。祝日は物事を混乱させますが、別の場所では別の作業週もあります。土曜日〜水曜日は木曜日と金曜日が「週末」です。他の場所では、土曜日は仕事の日(週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

私は数学を吸って、ネット上に見つかったアルゴリズムを信頼しないので、私は小規模な期間だけ正常に動作する無理矢理に投稿しました。しかし、あなたのコードがうまくいくなら大丈夫です。私はそれを目の当たりにすることでそれを判断できません。 – mplungjan

+0

「ブルートフォース」は、多くの場合、支払いや休暇などの計算では大丈夫ですが、多くの場合、実際には問題に過ぎません。どんな種類の人事制度(休暇、賃金、スケジュールなど)に対してもカレンダーを作成することは、すべてのビジネスルールと文化の違いが追加されたときには非常に複雑です。日数の加算と減算は氷山の一角です。 :-) – RobG

関連する問題