в соответствии с документацией момента , в основном без параметров, функция diff
возвращает число в milliseconds
, вы можете использовать years
, months
, weeks
, [ 119], hours
, minutes
и seconds
, если вы хотите использовать другую единицу времени.
принять во внимание:
По умолчанию момент # diff будет обрезать результат до нуля десятичных разрядов, возвращая целое число. Если вам нужно число с плавающей запятой, передайте true в качестве третьего аргумента.
blockquote>проверяет рабочий фрагмент кода, который показывает другие типы блоков.
const getTimeDiff = (differenceIn = 'milliseconds', floating= false) => { var now = moment("04-09-2013 15:00:00", "DD-MM-YYYY HH:mm:ss"); var then = moment("04-09-2013 14:59:40", "DD-MM-YYYY HH:mm:ss"); //this return the difference between now and then in milliseconds as default var timeDifference = now.diff(then, differenceIn, floating); console.log("Time difference - " + timeDifference + ' ' + differenceIn); } getTimeDiff(); getTimeDiff('seconds'); getTimeDiff('seconds', true); getTimeDiff('minutes'); getTimeDiff('minutes', true); getTimeDiff('hours'); getTimeDiff('hours', true); getTimeDiff('days'); getTimeDiff('days', true); getTimeDiff('weeks'); getTimeDiff('weeks', true); getTimeDiff('months'); getTimeDiff('months', true); getTimeDiff('years'); getTimeDiff('years', true);
В своем коде убедитесь, что вы пытаетесь выполнить
diff
изString
. В основном вы делаетеformat
перед применениемdiff
.
const getTimeDiffWithCurrentTime = (lastLoggedInDateTime) => { //***PROBLEM IS HERE IN THE BELLOW LINE WHERE THE OUTPUT IS 1547571895000*** var momentLastLoggedInDateTime = moment(lastLoggedInDateTime, "DD-MM-YYYY HH:mm:ss"); //var currentDateTime = moment().format("DD-MM-YYYY HH:mm:ss"); IF YOU DO THIS, you get a STRING var currentDateTime = moment() console.log(' lastLoggedInDateTime - ' + lastLoggedInDateTime + 'momentLastLoggedInDateTime - ' + momentLastLoggedInDateTime + ' currentDateTime - ' + currentDateTime); var timeDifference = currentDateTime.diff(momentLastLoggedInDateTime); console.log("Time difference - " + timeDifference); return timeDifference; } const newDate = new Date(new Date() - 10000); //minus 10 seconds getTimeDiffWithCurrentTime(newDate);
Я полагаю что этот код:
myTimer.Tick -= new EventHandler(ev);
создает новый объект EventHandler. Это никогда не будет удалять существующий EventHandler. Для получения функциональности, Вы хотите, необходимо быть передающими в EventHandlers, не MyDelegates, к добавлению и удалить методы:
Timer myTimer = new Timer(); // Windows.Forms Timer
public void addEvent(EventHandler ev)
{
myTimer.Tick += ev;
}
public void removeEvent(EventHandler ev)
{
myTimer.Tick -= ev;
}
Код вызова должен будет отслеживать добавленный EventHandlers, так, чтобы он мог передать в том же объекте EventHandler, когда пора отказаться от подписки.
Первоначальный код хорошо работает, настолько же долго как MyDelegate
'ev
'переданный в addEvent
и removeEvent
тот же экземпляр объекта (Например, если существует уровень класса MyDelegate
поле, которое содержит экземпляр или если Вы следуете совету нескольких других здесь и сохраняете MyDelegate
объект (объекты) в Словаре).
Я подозреваю, что проблема состоит в том что вызов кода addEvent
и removeEvent
передает новый MyDelegate
экземпляры, указывающие на некоторый метод обработчиков, как так:
addEvent(new MyDelegate(this.HandlerMethod));
// ... do some stuff
removeEvent(new MyDelegate(this.HandlerMethod));
В этом случае addEvent
и removeEvent
создают EventHandler
делегаты, которые указывают на различные адреса метода даже при том, что те делегаты в свою очередь указывают на тот же метод (this.HandlerMethod
). Это вызвано тем, что EventHandler
делегаты это add
и remove
точка формирования данных к MyDelegate.Invoke()
метод на различном MyDelegate
экземпляры, а не непосредственно к адресу this.HandlerMethod
.
Ваша проблема возникает из наличия вспомогательных методов сделать это. Без них это работает как ожидалось, с ними это не знает, что отсоединить.
Для фиксации этого необходимо будет поддержать словарь со значением, являющимся EventHandler, созданным в методе сцепления так, чтобы можно было удалить то значение позже.
Что-то как:
var handlers = new Dictionary<MyDelegate, EventHandler>();
public void addEvent(MyDelegate ev)
{
var handler = new EventHandler(ev);
handlers.Add(ev, handler);
myTimer.Tick += handler;
}
public void removeEvent(MyDelegate ev)
{
myTimer.Tick -= handlers[ev];
}
Необходимо добавить соответствующие проверки, если элемент существует.
Вы могли также изменить свой тип параметра, и он будет работать как ожидалось.
public void addEvent(EventHandler ev)
{
myTimer.Tick += ev;
}
public void removeEvent(EventHandler ev)
{
myTimer.Tick -= ev;
}
addEvent(new EventHandler(...));
removeEvent(new EventHandler(...));
Необходимо просто смочь отказаться от подписки путем ссылки на название ровного метода обработки как так:
public void removeEvent(MyDelegate ev)
{
myTimer.Tick -= ev as EventHandler;
}
При добавлении и удалении обработчиков событий Вы создаете новую обертку для своего делегата каждый раз. Таким образом в Вашем удалять метод это пытается удалить новый объект EventHandler, который никогда не добавлялся как слушатель события во-первых.
Если Вы хотите продолжать использовать этот тип установки, Вы могли бы, возможно, засунуть свой EventHandlers в Словарь. В addEvent методе засуньте свой недавно созданный EventHandler в Ваш словарь, и в removeEvent методе, вытяните EventHandler из словаря и удалите это вместо того, чтобы инстанцировать нового.
Я не знаю то, что Вы делаете неправильно, но обычный подход, который я использовал бы для Таймеров, должен будет подписаться на Tick
событие, и затем отключает Таймер, когда Вы не хотите получать события, повторно включая, когда Вы делаете.
Может не помочь Вам, если у Вас есть больше чем один обработчик событий, сцепленный до события, но надо надеяться несколько полезный.