jQuery - пресмятане на часовете от 22:00 до 06:00

Здравейте! Имам следния казус:
Имам две select option менюта, който ми държат часовете от 00:15 до 24:00.

Единия select option е за Работа започва (т.е. избира се час, през който дадена личност е започнал работа).

Другия select option е за Работа свършва (т.е. избира се час, когато същата личност е свършил работа)

Имам и трето текстово поле в което се генерира колко часа е работил въпросната личност, ако е бачкал между часовете 22:00 до 06:00

Кода работи при следните случай:
Като избера за работа започва 23:00 и работа свършва 06:00 - в текстовото поле ми се генерира, че е работил 07:00 часа нощен труд, което е добре.

Като избера за работа започва 08:00 и работа свършва 17:00 - в текстовото поле ми се генерира, че е работил 00:00 часа нощен труд, което е добре.

Като избера за работа започва 20:00 и работа свършва 24:00 - в текстовото поле ми се генерира, че е работил 02:00 часа нощен труд, което е добре (понеже за нощен труд се смятат работените часове му 22:00 и 06:00).

Като избера за работа започва 00:15 и работа свършва 09:00 - в текстовото поле ми се генерира, че е работил 05:45 часа нощен труд, което е добре.

Проблема е когато избера за работа започва 00:15 и работа свършва 23:00 в текстовото поле ми се генерира, че е работил 08:00 часа нощен труд, а трябва да бъде 06:45 нощен труд, понеже от 00:15 до 06:00 са 05:45 минути работа и от 22:00 до 23:00 са 1 час бачкане, то общо трябва да е 06:45 нощен труд.

Нещо обаче не мога да кача кода тук(при опит да кача кода ми дава грешка 403) и съм направил jsfiddle, където може и да се тества. Там проблемите съм ги описал като коментар долу под html кода.

P.S. Кода е грозно написан, но за тестване става!
 

AseasRoa

Well-Known Member
Ето ти един вариант:

Код:
$(document).ready(function() {
    $("#rabotaZapochva").change(workingAtNight);
    $("#rabotaShvyrshva").change(workingAtNight);
});

function strToSeconds(str) {
    var arr = str.split(":");
  var seconds = (arr[0] * 3600) + (arr[1] * 60);
 
  return seconds;
}

function secondsToStr(seconds)
{
    var h = Math.floor(seconds / 3600);
  var m = Math.floor((seconds - (h * 3600)) / 60);
 
  if (h < 10) h = "0" + h;
  if (m < 10) m = "0" + m;
 
  var str =  h + ":" + m;
 
  return str;
}

function workingAtNight () {
    var start_seconds = strToSeconds($('#rabotaZapochva').val());
    var end_seconds   = strToSeconds($('#rabotaShvyrshva').val());
    var t1 = 6 * 3600; // в колко секунди след 00:00 завършва нощната смяна
    var t2 = 22 * 3600; // в колко секунди след 00:00 започва нощната смяна
    var day_seconds = 24 * 3600; // броя на секунди в 1 ден (86400)
    var work_seconds  = 0; // ще бъде броя на секунди, през които е работено в нощна смяна
       
    if (start_seconds < end_seconds)
    {
        if (start_seconds < t1) work_seconds += t1 - start_seconds;
        if (end_seconds < t1) work_seconds -= t1 - end_seconds;
       
        if (end_seconds > t2) work_seconds += end_seconds - t2;
        if (start_seconds > t2) work_seconds -= start_seconds - t2;
    }
    else if (start_seconds > end_seconds)
    {
        if (end_seconds <= t1) work_seconds += end_seconds;
        if (start_seconds <= t1) work_seconds -= start_seconds;
         
        if (start_seconds >= t2) work_seconds += day_seconds - start_seconds;
    if (start_seconds < t2) work_seconds += day_seconds - t2;
        if (end_seconds > t1) work_seconds += t1;
        if (end_seconds >= t2) work_seconds += end_seconds - t2;
    }

    var test = secondsToStr(work_seconds);

    if (test > "08:00"){
        test = "08:00";
    }

    $('#noshtenTrud').val(test);
 };
Проверявах го, но може все още някъде да има грешка. Сигурно може и да се опрости, ама не ми се мисли повече
 

Горе