繁体   English   中英

JavaScript减去时差

[英]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语句(不确定im已成功完成)来做到这一点。

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

在这里,我仅希望语句在用户当前时间(也称为myTime)比开始日期大,而小于结束日期大时起作用。 这是因为开始日期存储为我上学时间的开始时间,而结束日期存储为我上学时间的结束时间。 如果用户当前的时间满足此要求,则转到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;
}

谢谢

扎克

您应该只使用分钟,而不是小时-分钟的组合,因为后者很难计算。

另外,如果使用数组存储不同的句点,则代码的重复次数将减少。

这是您可以执行的操作:

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

在我撰写本文时,要入睡,但是如果将每个概念分解成几小块,可能会更容易。 另外,如果可以使用Number ,则不要使用String ,这会使您的生活更轻松;

有用的功能,可从您编写的日期中获取日期中的数字

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

因此,您可以编写类似以下内容的内容,其中以下概念已分解为各自的块

  • hh:mm时间,与其他时间hhmm多远
  • 周期时隙,命名为,它距多远(直到/自)以及是否正在进行
  • 时间表,星期几,时段清单
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;
    }, []);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM