在MOMM JS中进行DateTime比较问题



我正在使用Moment.js进行日期时间比较,但到目前为止一直没有成功。我想在特定时间段内启用网站上的功能。我正在以JSON格式接收DateTime,该格式保存在数据库中,作为UTC DateTime。现在,我想检查当前日期时间是否介于启动插槽时间和结束插槽之间。

  1. 如果它在开始插槽时间之前就掉了,我将向用户显示一条消息" x-分钟激活"
  2. 如果它介于"激活特征"之间。
  3. 如果结束插槽时间降落,则不需要操作。

这就是我所做的。它在大多数时间工作,但仍有某些情况失败。

function checkEqual(startDateTime, endDateTime) {
var startDateTimeVal = startDateTime.substring(startDateTime.indexOf("(") + 1, startDateTime.indexOf(")"));
var endDateTimeVal = endDateTime.substring(endDateTime.indexOf("(") + 1, endDateTime.indexOf(")"));
const s = new Date(parseInt(startDateTimeVal));
const e = new Date(parseInt(endDateTimeVal));
const d = new Date();
var timeToActivate = 0, timeToActivateHours = 0, timeToActivateMinutes = 0;
if (s.getUTCDate() === d.getDate() && s.getUTCMonth() === d.getMonth() && s.getFullYear() === d.getFullYear()) { // date

    if (s.getUTCHours() <= d.getHours() && e.getUTCHours() >= d.getHours()) { // hours
        if (s.getUTCHours() === d.getHours()) {
           if (s.getUTCMinutes() <= d.getMinutes()) {
                return new Promise(function (resolve, reject) {
                    resolve(0);
                });
            }
            else {
                return new Promise(function (resolve, reject) {
                    timeToActivate = s.getUTCMinutes() - d.getMinutes();
                    toastr.info("chat will become active in next " + parseInt(timeToActivate) + " minutes!");
                    resolve(timeToActivate * 60000);
                });
            }
        }
        else if (e.getUTCHours() === d.getHours()) {
            if (e.getUTCMinutes() <= d.getMinutes()) {
                    return new Promise(function (resolve, reject) {
                        resolve(0);
                    });
                }
                else {
                    return new Promise(function (resolve, reject) {
                        timeToActivate = e.getUTCMinutes() - d.getMinutes();
                        toastr.info(" chat will become active in next " + parseInt(timeToActivate) + " minutes!");
                        resolve(timeToActivate * 60000);
                    });
                }
        }
        else {
                if (s.getUTCMinutes() <= d.getMinutes()) {
                    return new Promise(function (resolve, reject) {
                        resolve(0);
                    });
                }
                else {
                    return new Promise(function (resolve, reject) {
                        timeToActivate = s.getUTCMinutes() - d.getMinutes();
                        toastr.info("chat will become active in next " + parseInt(timeToActivate) + " minutes!");
                        resolve(timeToActivate * 60000);
                    });
                }
        }
    }
    else {
        if (s.getUTCHours() >= d.getHours()) { // logged in before time
            return new Promise(function (resolve, reject) {
                var timeToActivateHours = (s.getUTCHours() - d.getHours()) * 3600000;
                var timeToActivateMinutes;
                if (s.getUTCMinutes() > d.getMinutes()) {
                    timeToActivateMinutes = (d.getMinutes() - s.getUTCMinutes()) * 60000;
                }
                else {
                    timeToActivateMinutes = (s.getUTCMinutes()- d.getMinutes() ) * 60000;
                }

                timeToActivate = timeToActivateHours + timeToActivateMinutes;
                toastr.info("chat will become active in next " + parseInt(timeToActivate / 60000) + " minutes!");
                resolve(timeToActivate);
            });
        }
    }
}
return new Promise(function (resolve, reject) {
           resolve(-1);
});

}

最近,我尝试使用DIFF功能,但由于UTC和本地时区使我头疼,但仍然存在问题。有开始日期和结束DateTime。

开始dateTime:/date(1551966300000)/
结束日期:/date(1551969900000)/

任何形式的指导都非常感谢!

你可以尝试此逻辑

var start = 1551966300000 
var end = 1551969900000
var currentTime = moment().valueOf() //this should return a value  of current time utc
if(currentTime >= start && currentTime <= end ) {
//call your function
myFuction()
}
if(currentTime < start){
var current = moment(currentTime)
var diff = current.diff(start,'minutes')}//diff- minutes to activate 

是凌晨4点,我几乎还活着。但是看来您正在使用不需要的承诺,使代码变得复杂。可能想休息一下。无论如何。我已经看过古怪的格式。(/日期(1551966300000)/)我还将其切成薄片。后来我发现有一种方法可以瞬间解析。http://momentjs.com/docs/#/parsing/asp-net-json-date/tldr;"时刻会认识到它并照顾它"

我基本上要做

    const inputDate = Moment(value, "X");
    const referenceDateStart = Moment(startSlot);
    const referenceDateEnd = Moment(endSlot);
    const minutesToGo = referenceDateStart.diff(inputDate, "minutes");
    if (minutesToGo < 0) {
      return;
      // no action needed, it falls after the endTime
    }

    if (minutesToGo > 0) {
      console.log(`${minutesToGo}  minutes to activate`);
      return;
      // before start time
    }
    /*this last scenario es the more complex one to calculate. it's also the logical 
        alternative. sooo you can skip the validate . Booyah!*/
    console.log("feature activated");

/*disclosure. you'll need to test whether those ">" and "<" are correct. you might need to flip them*/

最新更新