2016-12-27 4 views
0

Я только что сделал следующий код и имею несколько проблем с ним. Вся идея проекта заключается в том, чтобы определить, сколько времени вы оставили в школьный период или до начала периода. Сначала я сохранил время пользователя в качестве переменной и выделил текущие часы и минуты, используя подстроку. Вот код для этого.JavaScript Subtract Time Diffrence

//Get current date. 
var now = new Date(); 
//Make the date only hours and minutes But the issue is there is a semicolon (:) in between them. 
var myTime = now.toString().substr(16,5) 

Проблема с этим была оставлена ​​с точкой с запятой, которая препятствует работе всего этого.

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

if (myTime > startday || myTime < endday) { 

Здесь я хочу только заявление, чтобы работать, если пользователи текущего времени, также известный как Mytime больше, чем startday и МЕНЬШЕ endday. Это связано с тем, что начальный день хранится как начало моего школьного дня, а конец дня сохраняется как время окончания моего школьного дня. Если пользовательский текущий доза времени соответствует этому требованию, он переходит к инструкции else, которая говорит, что школа еще не началась.

Вот остальная часть кода, если вы хотите видеть и делать какие-либо предложения.

//Get current date. 
var now = new Date(); 
//Make the date only hours and minutes But the issue is there is a semicolen (:) in between them. 
var myTime = now.toString().substr(16,5) 
//For Testing Purposes. 
console.log(myTime); 

//All the periods throught my school day. 
var startday = 0745; 
var period1end = 0834; 
var period1transition = 0838; 
var period2end = 0930; 
var period2transition = 0934; 
var period3end = 1023; 
var period3transition = 1027; 
var period4end = 1116; 
var period4transition = 1120; 
var period5end = 1238; 
var period5transition = 1242; 
var period6end = 1331; 
var period6transition = 1335; 
var period7end = 1425; 
var endday = 1425; 

//The big boy, I will tell you my thought proccess as I go 
function myFunction() { 
//Here I ONLY want the statement to work if the users current time, also known as myTime is GREATER than startday and less than endday. This is because startday is stored as the start of my school day and endday is the end of the day. If the users current time dosent meet this requirement it then goes to the else statement which says school hasnt started yet. 
    if (myTime > startday || myTime < endday) { 
     console.log("Test"); 
//The purpose of this statement is the following. If the users time is LESS than the time period 1 ends it will then subtract period1's time from the users current time. 
    } else if (myTime < period1end) { 
     var timeleft = (period1end-myTime); 
     console.log("There is" + timeleft + "mintues left in the period."); 
//The purpose of this statement is if the users time is in between a period, also known as period1transition, it says the amount of time until the next period starts. 
    } else if (myTime < period1transition) { 
     var timeleft = (period1transition-myTime); 
     console.log("There is" + timeleft + "mintues left until the next period starts."); 
    } else if (myTime < period2end) { 
     var timeleft = (period2end-myTime); 
     console.log("There is" + timeleft + "mintues left in the period."); 
    } else if (myTime < period2transition) { 
     var timeleft = (period2transition-myTime); 
     console.log("There is" + timeleft + "mintues left until the next period starts."); 
    } else if (myTime < period3end) { 
     var timeleft = (period3end-myTime); 
     console.log("There is" + timeleft + "mintues left in the period."); 
    } else if (myTime < period3transition) { 
     var timeleft = (period3transition-myTime); 
     console.log("There is" + timeleft + "mintues left until the next period starts."); 
    } else if (myTime < period4end) { 
     var timeleft = (period4end-myTime); 
     console.log("There is" + timeleft + "mintues left in the period."); 
    } else if (myTime < period4transition) { 
     var timeleft = (period4transition-myTime); 
     console.log("There is" + timeleft + "mintues left until the next period starts."); 
    } else if (myTime < period5end) { 
     var timeleft = (period5end-myTime); 
     console.log("There is" + timeleft + "mintues left in the period."); 
    } else if (myTime < period5transition) { 
     var timeleft = (period5transition-myTime); 
     console.log("There is" + timeleft + "mintues left until the next period starts."); 
    } else if (myTime < period6end) { 
     var timeleft = (period6end-myTime); 
     console.log("There is" + timeleft + "mintues left in the period."); 
    } else if (myTime < period6transition) { 
     var timeleft = (period6transition-myTime); 
     console.log("There is" + timeleft + "mintues left until the next period starts."); 
    } else if (myTime < period7end) { 
     var timeleft = (period7end-myTime); 
     console.log("There is" + timeleft + "mintues left in the period."); 
    } else if (myTime < period7transition) { 
     var timeleft = (period7transition-myTime); 
     console.log("There is" + timeleft + "mintues left until the next period starts."); 
    } else { 
//If the users time is not greater than the startday and less than the endday it simply says the following. 
     console.log("School Has Not Started Yet"); 
    } 
    //forget about this. 
// document.getElementById("demo").innerHTML = myTime; 
} 

Благодаря

Zach

+3

Мое предложение состоит в том, что вы угробили все это и начать все сначала с помощью [moment.js] (HTTP: // momentjs.com/). – JohnnyHK

+0

@JohnnyHK Будет ли это намного проще? –

+0

@ zmalter99 Да, это будет –

ответ

0

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

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

Вот как можно это сделать:

//Get current date & midnight 
 
var now = new Date(); 
 
var midnight = new Date(); 
 
midnight.setHours(0,0,0,0); 
 
//Get number of minutes that passed since midnight: 
 
var myTime = Math.floor((now.getTime() - midnight.getTime())/60000); 
 
//For Testing Purposes. 
 
console.log(myTime + ' minutes passed since midnight.'); 
 

 
function minutes(hour, min) { 
 
    return hour * 60 + min; 
 
} 
 

 
//All the periods throughout my school day. 
 
var periods = [ 
 
    { start: minutes(7, 45), end: minutes(8, 34) }, 
 
    { start: minutes(8, 38), end: minutes(9, 30) }, 
 
    { start: minutes(9, 34), end: minutes(10, 23) }, 
 
    { start: minutes(10, 27), end: minutes(11, 16) }, 
 
    { start: minutes(11, 20), end: minutes(12, 38) }, 
 
    { start: minutes(12, 42), end: minutes(13, 31) }, 
 
    { start: minutes(13, 35), end: minutes(14, 25) }, 
 
]; 
 

 
function myFunction(myTime, periods) { 
 
    periods.every(function (period, i) { 
 
     if (myTime < period.start) { 
 
      if (i == 0) { 
 
       console.log('School has not started yet'); 
 
      } else { 
 
       var timeLeft = period.start - myTime; 
 
       console.log("There are " + timeLeft + 
 
          " minutes left until period " + (i+1) + " starts."); 
 
      } 
 
     } else if (myTime < period.end) { 
 
      var timeLeft = period.end - myTime; 
 
      console.log("There are " + timeLeft + 
 
         " minutes left until period " + (i+1) + " is over."); 
 
     } else if (i == periods.length - 1) { 
 
      console.log('School has finished for today'); 
 
     } else { 
 
      return true; // keep looking for the right period 
 
     } 
 
    }); 
 
} 
 

 
myFunction(myTime, periods);

+0

Можете ли вы объяснить массив? @trincot –

+0

Как насчет этого? – trincot

+0

Почему вы делаете «минуты (число, число)» @trincot –

0

Засыпая, как я пишу это, но это может быть намного легче, если вы нарушите каждое понятие вниз на куски размером укуса.Кроме того, не работайте с String, если вы можете работать с Номер, это сделает вашу жизнь проще;

Полезные функции для получения номера из Даты в том, что вы написали

const now = new Date(); 
const day = now.getDay(); 
const hh = now.getHours(); 
const mm = now.getMinutes(); 

Таким образом, вы могли бы написать что-то вроде этого, где следующие понятия были разбиты на свои собственные куски

  • чч: мм время, как далеко это от другого времени hh и mm
  • Период временной интервал, названный, как далеко он находится (пока/с тех пор), и является ли он в ходе
  • расписание, дни недели, списки временных интервалов
class TimeTableTime { 
    constructor(hh, mm) { 
     this.hh = hh; 
     this.mm = mm; 
    } 
    until(hh, mm) { // ms 
     return (this.hh - hh) * 60 * 60 * 1000 
      + (this.mm - mm) * 60 * 1000; 
    } 
} 

class TimeTableSlot { 
    constructor(startHh, startMm, endHh, endMm, name) { 
     this.start = new TimeTableTime(startHh, startMm); 
     this.end = new TimeTableTime(endHh, endMm); 
     this.name = name; 
    } 
    until(hh, mm) { 
     return this.start.until(hh, mm); 
    } 
    since(hh, mm) { 
     return -this.end.until(hh, mm); 
    } 
    current(hh, mm) { 
     return this.start.until(hh, mm) <= 0 
      && this.end.until(hh, mm) > 0; 
    } 
} 
const timetable = { 
    0: [], // Sunday 
    1: [ 
     new TimeTableSlot(7, 45, 8, 34, 'Period 1'), 
     new TimeTableSlot(8, 34, 8, 38, 'Period 1 Transition'), 

     new TimeTableSlot(8, 38, 9, 30, 'Period 2'), 
     new TimeTableSlot(9, 30, 9, 34, 'Period 2 Transition') 
    ], 
    6: [] // Saturday 
}; 
// populate other days with example data from Monday 
(function() { 
    let i; 
    for (i = 2; i < 6; ++i) timetable[i] = timetable[1]; 
}()); 
// Ideally, you'd also make TimeTable a class and these would be on it's prototype 
function current() { 
    const now = new Date(); 
    const day = now.getDay(); 
    const hh = now.getHours(); 
    const mm = now.getMinutes(); 

    return timetable[day].filter(slot => slot.current(hh, mm)); 
} 

function next() { 
    const now = new Date(); 
    const day = now.getDay(); 
    const hh = now.getHours(); 
    const mm = now.getMinutes(); 

    let delta = Infinity; 
    return timetable[day].reduce((soonest, testSlot) => { 
     let delta2 = testSlot.until(hh, mm); 
     if (delta2 < 0) { 
      return soonest; 
     } 
     if (delta2 === delta) { 
      soonest.push(testSlot); 
      return soonest; 
     } 
     if (delta2 < delta) { 
      delta = delta2; 
      return [testSlot]; 
     } 

     return soonest; 
    }, []); 
}