如何获得当前的入学时间和剩余时间?

时间:2018-02-16 16:46:01

标签: javascript date time

我有这个功能:

function getInfoSchoolTime() {
	var date = new Date();
	var schoolBellTime = ["8:10","9:02","9:54","9:59","10:51","11:43","11:58","12:48","13:35","13:40","14:10","15:02","15:54"];
	var remainingTime, currentHour;

	for (var i = 0; i < schoolBellTime.length-1; i++) {
		var startTime = schoolBellTime[i].split(":");
		var endTime = schoolBellTime[i+1].split(":");

		if (parseInt(startTime[0]) >= date.getHours() && parseInt(startTime[1]) >= date.getMinutes())
			if (parseInt(endTime[0]) <= date.getHours() && parseInt(endTime[1]) <= date.getMinutes()) {
				currentHour = i;
				remainingTime=(parseInt(endTime[1])-date.getMinutes()+60)%60;
				break;
			}
	}

  if (currentHour == undefined)
		return {current: -1, remaining: "not available"};
	return {current: currentHour, remaining: remainingTime};
}

var info = getInfoSchoolTime();
console.log(info.current, info.remaining);

我有schoolBellTime数组,其中包含校钟的时间戳(我知道,我的学校有很多钟时间,这些时间戳包括游戏时间和午餐时间),此功能是为了返回第1小时/第2小时小时/第3小时......以及下一小时/休息时间的剩余时间。

我检查了所有代码但找不到错误,它不断返回{current: -1, remaining: "not available"}

3 个答案:

答案 0 :(得分:1)

顶部的函数:setDateTime()占用日期和时间,并构造该时间的日期对象。

然后我更新了您的功能,我将startend转换为当天的时间,然后检查它们之间是否发生date.getTime()。然后,我只需从date.getTime()中减去end,然后将结果转换为毫秒级的分钟数。

&#13;
&#13;
var setDateTime = function(date, str) {
  var sp = str.split(':');
  date.setHours(parseInt(sp[0], 10));
  date.setMinutes(parseInt(sp[1], 10));
  return date;
}

function getInfoSchoolTime() {
  var date = new Date();
  var schoolBellTime = ["8:10", "9:02", "9:54", "9:59", "10:51", "11:43", "11:58", "12:48", "13:35", "13:40", "14:10", "14:10", "15:02", "15:54"];
  var remainingTime, currentHour, currentPeriod;

  for (var i = 0; i < schoolBellTime.length - 1; i++) {
    start = setDateTime(new Date(), schoolBellTime[i])
    end = setDateTime(new Date(), schoolBellTime[i + 1])
    if (date.getTime() > start.getTime() && date.getTime() < end.getTime()) {
      currentHour = i
      remainingTime = end.getTime() - date.getTime()
      currentPeriod = ([schoolBellTime[i], schoolBellTime[i+1]]).join('-')
    }
  }
  return {current: currentHour, currentPeriod: currentPeriod, remaining: Math.round(remainingTime * 0.0000166667)}
}

console.log(getInfoSchoolTime())
&#13;
&#13;
&#13;

答案 1 :(得分:1)

对于代码和API,这是一种稍微不同的方法。它使用两个辅助函数。每个应该是明显的,只有一个例子:pad(7) //=> "07"pairs(['foo', 'bar', 'baz', 'qux']) //=> [['foo', 'bar'], ['bar', 'baz'], ['baz', 'qux']]

main函数获取一个响铃时间列表并返回一个函数,该函数本身接受一个日期对象并返回您正在查找的输出类型(句点,剩余时间段)。此API使测试更容易。

const pad = nbr => ('00' + nbr).slice(-2)
const pairs = vals => vals.reduce((res, val, idx) => idx < 1 ? res : res.concat([[vals[idx - 1], val]]), [])

const schoolPeriods = (schoolBellTime) => {
  const subtractTimes = (t1, t2) => 60 * t1.hour + t1.minute - (60 * t2.hour + t2.minute)
  const periods = pairs(schoolBellTime.map(time => ({hour: time.split(':')[0], minute: +time.split(':')[1]})))
  
  return date => {
    const current = {hour: date.getHours(), minute: date.getMinutes()}
    if (subtractTimes(current, periods[0][0]) < 0) {
      return {message: 'before school day'}
    }
    if (subtractTimes(current, periods[periods.length - 1][1]) > 0) {
      return {message: 'after school day'}
    }
    const idx = periods.findIndex(period => subtractTimes(current, period[0]) >= 0 && subtractTimes(period[1], current) > 0)
    const period = periods[idx]
    return {
      current: idx + 1,
      currentPeriod: `${period[0].hour}:${pad(period[0].minute)} - ${period[1].hour}:${pad(period[1].minute)}`,
      remaining: subtractTimes(period[1], current)
    }
  }
}

const getPeriod = schoolPeriods(["8:10","9:02","9:54","9:59","10:51","11:43","11:58","12:48","13:35","13:40","14:10","14:10","15:02","15:54"])

console.log("Using current time")
console.log(getPeriod(new Date()))
console.log("Using a fixed time")
console.log(getPeriod(new Date(2017, 11, 22, 14, 27))) // will Christmas break ever come?!

如果日期超出期间范围,我会随机猜测你想要的行为。

在内部,它会创建一个类似于

的句点对象列表
[{hour:9, minute: 59}, {hour: 10, minute: 51}]

如果不是一个双元素数组,那么它可能会更加清晰,它是一个具有startend属性的对象。这将是一个很容易的改变。

请注意,为了理所当然,需要按顺序列出铃声。我们可以通过sort调用解决此问题,但我认为没有充分的理由这样做。

答案 2 :(得分:0)

这是一个使用deconstruct(const [a,b]=[1,2]),数组映射,数组缩减,部分应用程序(闭包)和胖箭头函数语法的ES6示例。

这可能不适用于旧浏览器。

//pass date and bellTimes to function so you can test it more easily
//  you can partially apply bellTimes 
const getInfoSchoolTime = bellTimes => {
  //convert hour and minute to a number
  const convertedBellTimes = bellTimes
    .map(bellTime=>bellTime.split(":"))//split hour and minute
    .map(([hour,minute])=>[new Number(hour),new Number(minute)])//convert to number
    .map(([hour,minute])=>(hour*60)+minute)//create single number (hour*60)+minutes
    .reduce(//zip with next
      (ret,item,index,all)=>
        (index!==all.length-1)//do not do last one, create [1,2][2,3][3,4]...
          ? ret.concat([[item,all[index+1]]])
          : ret,
      []
    );
  return date =>{
    //convert passed in date to a number (hour*60)+minutes
    const passedInTime = (date.getHours()*60)+date.getMinutes();
    return convertedBellTimes.reduce(
      ([ret,goOn],[low,high],index,all)=>
        //if goOn is true and passedInTime between current and next bell item
        (goOn && passedInTime<high && passedInTime>=low)
          ? [//found the item, return object and set goOn to false
              {
                current: index+1,
                currentPeriod: bellTimes[index]+"-"+bellTimes[index+1],
                remaining: high-passedInTime
              },
              false//set goOn to false, do not continue checking
            ]
          : [ret,goOn],//continue looking or continue skipping (if goOn is false)
      [
        {current: 0, currentPeriod: "School is out", remaining: 0},//default value
        true//initial value for goOn
      ]
    )[0];//reduced to multiple values (value, go on) only need value
  }
};

//some tests
const date = new Date();
//partially apply with some bell times
const schoolTime = getInfoSchoolTime(
  [
    "8:10", "9:02", "9:54", "9:59", "10:51",
    "11:43", "11:58", "12:48", "13:35", "13:40",
    "14:10", "14:10", "15:02", "15:54"
  ]
);
//helper to log time from a date
const formatTime = date =>
  ("0"+date.getHours()).slice(-2)+":"+("0"+date.getMinutes()).slice(-2);
date.setHours(11);
date.setMinutes(1);
console.log(formatTime(date),schoolTime(date));//11:01
date.setHours(15);
date.setMinutes(53);
console.log(formatTime(date),schoolTime(date));//15:53
date.setHours(23);
date.setMinutes(1);
console.log(formatTime(date),schoolTime(date));//23:01