Неожиданный результат от сценариев, сравнивающих значения даты / времени - PullRequest
0 голосов
/ 30 апреля 2019

Я сохранил два общих атрибута устройства (MonitorStartTime ("20:00") и MonitorStopTime ("06:00"), и я хотел бы определить, находится ли текущая дата / время в этом интервале времени.

Я попытался добавить следующий скрипт фильтра в цепочку правил:

var today = new Date();
var MonitorStartTime = metadata.shared_MonitorStartTime;
var MonitorStopTime = metadata.shared_MonitorStopTime;
var dd = String(today.getDate());
var mm = String(today.getMonth() + 1); //January is 0!
var yyyy = today.getFullYear();

var MonitorStartTime = new Date(mm +'/' + dd + '/' + yyyy + " " + MonitorStartTime);
var MonitorStopTime = new Date(mm +'/' + dd + '/' + yyyy + " " + MonitorStopTime);
if (MonitorStopTime < MonitorStartTime)
{
    MonitorStopTime.setDate(MonitorStopTime.getDate() + 1);
}

return (today > MonitorStartTime) && (today< MonitorStopTime);    

Когда metadata.shared_MonitorStartTime равен «19:00», а metadata.shared_MonitorStopTime равен «06:00», я ожидаю, что вывод будетбыть верным в 20:30, но это не так. Когда время проходит 21:00, оно возвращает истину.

Имеет ли это отношение к часовым поясам? Thingsboard работает на экземпляре AWS EC2 в зоне eu-west-2а. Я нахожусь в Швеции (UTC + 2 часа).

Если да, то как мне это исправить? Спасибо за помощь, поскольку JavaScript не моя чашка чая; -)

1 Ответ

0 голосов
/ 30 апреля 2019

Вот случай, когда он терпит неудачу. Предположим, что today это когда-то до 06:00 и 08:00 PM , например. 2019-05-01 01:00 AM тогда:

var today = new Date();                                     // 2019-05-01 01:00 AM
var MonitorStartTime = new Date(...);                       // 2019-05-01 08:00 PM
var MonitorStopTime  = new Date(...);                       // 2019-05-02 06:00 AM
return today > MonitorStartTime && today < MonitorStopTime; // false!

Я бы предложил переписать вашу логику так:

var today = new Date();
var MonitorStartTime = new Date();
var MonitorStopTime = new Date();
MonitorStartTime.setHours(20, 0); // populate it from 20:00
MonitorStopTime.setHours(6, 0);   // populate it from 06:00
return MonitorStartTime <= MonitorStopTime
     ? (today >= MonitorStartTime && today < MonitorStopTime)
     : (today >= MonitorStartTime || today < MonitorStopTime);

Я не проверял все случаи, но именно так вы справляетесь со средними ночами в целом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...