2016-12-01 1 views
1

В текущем сценарии можно с уверенностью предположить, что все сравниваемые даты относятся к одному дню, поэтому сохраняется только время.Безопасное сравнение времени в Moment.js

Однако очевидно, что существует ненулевая вероятность проблемы типа Y2K.

Этот фрагмент кода может произойти сбой при выполняется в 00:00 (примерно), если momentTimeA линии оценивается в 23: 59: 59,999 одного дня и momentTimeB линии оценивается в 00: 00: 00.000 другой день:

// timeA is '06:00:00', momentTimeA is '2016-11-11T06:00:00.000'; 
const momentTimeA = moment(timeA, 'H:mm:ss'); 

// ... 

// timeB is '03:00:00', momentTimeB is '2016-11-12T03:00:00.000'; 
const momentTimeB = moment(timeB, 'H:mm:ss'); 

// should be positive 
momentTimeA.diff(momentTimeB); 

В настоящее время этот код, который выполняет сравнения времени, работает синхронно, но может стать асинхронным позже, это значительно увеличит риск.

Как решить эту проблему?

+0

Когда вы получите время 0:00:00, попробуйте изменить его на 0:00:01 (или что-то не сломает его, что действительно близко к 0:00:00, например, 12:59:59), если время EXACT не является действительно необходимым. – Feathercrown

+0

@Feathercrown Я бы предпочел избежать этого, если это возможно, потому что время должно быть квантовано иногда, а некоторые из сравнений выполняются с жестко закодированными «00: 00» и «24: 00», это усложнит логику. – estus

+0

Ну, хм ... Я думаю, вы могли бы проверить, равен ли он нулю и просто взять значение другого как разницу. – Feathercrown

ответ

1

Поскольку вы имеете дело с диапазоном времени, который может пересекать за полночь, и вы не учитываете даты, тогда вам нужно будет самостоятельно определить и настроить это.

// your inputs 
var timeA = '06:00:00'; 
var timeB = '03:00:00'; 

// today's date as a string 
var today = moment().format('YYYY-MM-DD'); 

// both moments created using the same date 
var momentTimeA = moment(today + ' ' + timeA, 'YYYY-MM-DD H:mm:ss'); 
var momentTimeB = moment(today + ' ' + timeB, 'YYYY-MM-DD H:mm:ss'); 

// check if midnight is crossed 
if (momentTimeA.isAfter(momentTimeB)) { 

    // move A back a day (this is an assumption!) 
    var yesterday = moment().subtract(1, 'day').format('YYYY-MM-DD'); 
    momentTimeA = moment(yesterday + ' ' + timeA, 'YYYY-MM-DD H:mm:ss'); 
} 

// now you can take the difference 
var delta = momentTimeB.diff(momentTimeA); 

Обратите внимание, что у вас были A и B в оригинальной разнице. Предполагая, что A на первом месте, используйте B.diff(A), чтобы получить положительный результат.

Также обратите внимание, что в приведенном выше коде важно, чтобы вы не просто вычитали день с момента его настройки, а то, что вы воссоздаете новый момент вчера в данный момент. Это связано с тем, что вы работаете в по местному времени, что может привести к переходу DST на одно из предоставленных времен.

+0

Да, простая конкатенация выглядит довольно хорошо. Спасибо за уведомление о DST. – estus