Проблема с датой и временем сравнения в момент JS - PullRequest
0 голосов
/ 07 марта 2019

Я использую moment.js для сравнения даты и времени, но пока безуспешно.Я хочу включить функциональность на моем веб-сайте в определенный промежуток времени.Я получаю datetime в формате json, который сохраняется в базе данных как 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);
});

}

Совсем недавно я пытался использовать функцию сравнения, но все еще есть проблемы, поскольку utc и местный часовой пояс даюту меня болит голова.есть дата и время начала и окончания.

Дата и время начала: / Дата (1551966300000) /
Дата и время окончания: / Дата (1551969900000) /

Любое руководство очень ценится!

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Сейчас 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*/
0 голосов
/ 07 марта 2019

U может попробовать эту логику

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...