2016-12-01 43 views
1

在當前情況下,可以安全地假定所有比較日期都是同一天,因此只存儲時間。Moment.js中的安全時間比較

然而,顯然存在類似Y2K問題的非零概率。

這段代碼可能會失敗時被在00:00(粗略地)如果momentTimeA線在23執行評價:59:00:00.000另一天的:一天和momentTimeB線的59.999 00被評估

// 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),如果確切的時間不是真的有必要。 – 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