js 兩日期相減計算

常常有機會碰到javascript日期計算,而通常資料都是`2018/08/22 15:30:00”的字串格式,所以趁這個機會紀錄一下。

日期計算通常都會利用javascript的DateTime物件來做處理,所以第一步是先將字串格式轉換成js的日期物件

1
2
3
4
5
6
function convertStrToDate(dateStr) {
let ary = dateStr.split(" ");
let d = ary[0].split("/");
let t = ary[1].split(":");
return new Date(d[0], d[1] - 1, d[2], t[0], t[1], t[2], 00);
}

接著透過日期物件的getTime()取得毫秒數再去相減,不過其實也可以直接用兩個日期物件相減,得到的一樣會是毫秒數。最後再將毫秒數轉為我們需要的字串格式,當中利用到的基本觀念就是進位、取餘數。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Marh.round() 四捨五入
Math.round(1.4); // 1
Math.round(1.5); // 2

// Math.floor() 無條件捨去
Math.floor(1.9); // 1
Math.floor(2.1); // 2

// Math.ceil() 無條件進位
Math.ceil(0.9); // 1
Math.ceil(1.1); // 2

// 取餘數,整數
Math.floor(10 % 3) // 1

// 取除法,整數
Math.floor(10 / 3) // 3

有了兩個日期相差的毫秒數之後,再透過上述數學運算,可以分別取得差異的天數、小時數、分鐘數、秒數,再將這些資料以需要的格式輸出

1
2
3
4
5
6
7
8
9
function dateDiff(start, end) {
const leftPad = num => (num > 9 ? num : "0" + num);
let diffMs = end - start; // 取得兩日期相差的毫秒數
let diffDays = Math.floor((diffMs / 86400000)); // 取得天數
let diffHrs = Math.floor((diffMs % 86400000) / 3600000); // 取得小時數
let diffMins = Math.floor(((diffMs % 86400000) % 3600000) / 60000); // 取得分鐘數
let diffSecs = Math.floor((((diffMs % 86400000) % 3600000) % 60000) / 1000); // 取得秒數
return leftPad(diffHrs) + ":" + leftPad(diffMins) + ":" + leftPad(diffSecs);
}

實務上就可以直接透過這樣的方式進行計算,取得兩個日期的差異結果了

1
2
3
let startTime = convertStrToDate("2019/08/21 15:30:00");
let endTime = convertStrToDate("2019/08/23 16:55:05");
let result = dateDiff(startTime, endTime) // 01:25:05