2016-06-27 4 views
3

Я пытаюсь создать раскрывающийся список, который автоматически вводит даты в текстовые поля.Javascript - переменная previous рабочий день

Опция «LBD» в настоящее время возвращает вчерашнюю дату, однако я бы хотел, чтобы она вернула дату последнего рабочего дня. Так что, если сегодня понедельник, он вернется в пятницу, если сегодня вторник, он вернется к дате в понедельник. Так далее и тому подобное.

Это то, что я получил до сих пор:

Javascript:

<script> 
$(document).ready(function() { 
$("#datetype option").filter(function() { 
    return $(this).val() == $("#datepickstart").val(); 
    return $(this).val() == $("#datepickend").val(); 
}).attr('selected', true); 
    var d = new Date(); 
var yesterday = (d.getMonth() + 1) + "/" + (d.getDate() - 1) + "/" + d.getFullYear(); 
var today = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear(); 
var fdm = (d.getMonth() + 1) + '/01/' + d.getFullYear(); 
var fdy = '01/01/' + new Date().getFullYear(); 
$("#datetype").on("change", function() { 
    var selectedVal = $(this).find("option:selected").attr("value"); 
    if (selectedVal == 'LBD') { 
     $("#datepickstart").val((yesterday)); 
     $("#datepickend").val((yesterday)); 
    } 
    if (selectedVal == 'MtD') { 
     $("#datepickstart").val(fdm); 
     $("#datepickend").val(today); 
    } 
    if (selectedVal == 'YtD') { 
     $("#datepickstart").val(fdy); 
     $("#datepickend").val(today); 
    } 
}); 
}) 
</script> 

HTML:

<select id="datetype" name="datetype"> 
<option value="">Please select...</option> 
<option value="LBD">LBD</option> 
<option value="MtD">MtD</option> 
<option value="YtD">YtD</option> 
</select> 

<input type="text" id="datepickstart" name="datepickstart" value=""> 
<input type="text" id="datepickend" name="datepickend" value=""> 
+1

код просто 'в то время как {date.setDate (date.getDate() - 1)} (isBusinessDay (дата)!) ', сложная часть записывает функцию' isBusinessDay'. – zzzzBov

ответ

1

Чтобы достичь ожидаемого результата, просчитайте день и уменьшите дни, чтобы получить предыдущий рабочий день.

$(document).ready(function() { 
    $("#datetype option").filter(function() { 
    return $(this).val() == $("#datepickstart").val(); 
    return $(this).val() == $("#datepickend").val(); 
    }).attr('selected', true); 

    var d = new Date(); 
    var bd = d.getDay(); 
    if (bd < 2) { 
    if (bd == 0) { 
     bd = 2; 
    } else { 
     bd = 3; 
    } 
    } else { 
    bd = 1; 
    } 
    var today = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear(); 
    var lbd = (d.getMonth() + 1) + "/" + (d.getDate() - bd) + "/" + d.getFullYear(); 
    var fdm = (d.getMonth() + 1) + '/01/' + d.getFullYear(); 

    var fdy = '01/01/' + new Date().getFullYear(); 

    $("#datetype").on("change", function() { 
    var selectedVal = $(this).find("option:selected").attr("value"); 
    if (selectedVal == 'LBD') { 
     $("#datepickstart").val(lbd); 
     $("#datepickend").val(today); 
    } 
    if (selectedVal == 'MtD') { 
     $("#datepickstart").val(fdm); 
     $("#datepickend").val(today); 
    } 
    if (selectedVal == 'YtD') { 
     $("#datepickstart").val(fdy); 
     $("#datepickend").val(today); 
    } 

    }); 
}); 

Codepen- http://codepen.io/nagasai/pen/wWgQYE

расчет LBD часть

var bd = d.getDay();// get day from today's date which be between 0-6 (0 is Sunday and 6 is Saturday 
    if (bd < 2) { 
    if (bd == 0) { 
     bd = 2; 
    } else { 
     bd = 3; 
    } 
    } else { 
    bd = 1; 
    } 
//variable lbd will get the last business day by reducing the calculated lbd from today's date 
    var lbd = (d.getMonth() + 1) + "/" + (d.getDate() - bd) + "/" + d.getFullYear(); 
1

Вы можете использовать яваскрипт getDay() метода вернет вам целое число, представляющее день недели:

Значение, возвращаемое функцией getDay(), является целым числом, соответствующим дню недели: 0 для воскресенья, 1 для понедельника, 2 для вторника и т. Д.

See docs for getDay() on MDN

Таким образом, вы могли бы написать метод, который возвращает ложь, если getDay() возвращает 0 (воскресенье) или 6 (суббота).

0
function isBusinessDay(theDate){ 
    theDay = theDate.getDay(); // Get day returns 0-6, respectively Sunday - Saturday 
    if(theDay == 0 || theDay == 6){ 
    return false; 
    } else { 
    return true; 
    } 
} 

Использование с while (!isBusinessDay(date)) { date.setDate(date.getDate() - 1) }

более краткой форме zzzzBov, чтобы записать его:

функция
function isBusinessDay(theDate){ 
    theDay = theDate.getDay(); // Get day returns 0-6, respectively Sunday - Saturday 
    if(theDay == 0 || theDay == 6) return false; 
    return true; 
} 
2

getDay() является ключевым для вашей проблемы. Я использовал фрагмент @zzzzBov для итератора. Ниже мое решение

step1: 
    function isBusinessDay(date){ 
    var day = date.getDay(); 
    if(day == 0 || day == 6 ){ 
     return false; 
    } 
    return true; 
    } 


step2: 
    var date = new Date(); 
    while (!isBusinessDay(date)) { date.setDate(date.getDate() - 1) } 

    console.log(date);//date always between monday to friday 

Надеюсь, что это решает вашу проблему. Счастливое кодирование!