다음과 같은 2개의 시간의 차이를 구하는 방법에 대해 알아보겠습니다.
12:50 AM
~ 07:20 AM
09:30 PM
~ 07:30 AM
시간 데이터가 다음과 같이 문자열로 저장되어 있다고 가정하겠습니다.
const timeData = '12:50 AM';
여기서는 문자열로 지정했지만, 객체로 지정하는 것이 좀 더 효율적인 방법일 수 있습니다.
객체로 지정하는 것이 더 좋은 이유는 프로퍼티 키별로 값을 저장할 수 있고, AM, PM과 같은 meridiem 부분의 타입을 확실하게 지정해줄 수 있기 때문입니다.
AM/PM과 같은 시간을 나누는 기준이 있다면 24시간으로 환산하여 변경해주는 것이 계산하기가 편리합니다.
이제 이 시간 데이터를 24시간제로 변환하는 함수를 작성합니다.
오전 12시는 0시로, 오후 12시는 12시로 구분합니다.
function padStringWithZero(str: string) {
return str.padStart(2, '0'); // 10 미만의 숫자 앞에 0 붙이기
}
function convert24Hour(timeData: string) {
const hour = timeData.slice(0, 2);
const minute = timeData.slice(3, 5);
const meridiem = timeData.slice(-2);
if (meridiem === 'AM') {
return hour === '12' ? `00:${minute}` : `${padStringWidthZero(hour)}:${minute}`;
} else {
return hour === '12' ? `12:${minute}` : `${parseInt(hour) + 12}:${minute}`;
}
}
이제 시간 데이터를 위 함수의 매개변수로 전달하게 되면, 00:00
~ 23:59
의 값 범위에 포함됩니다.
const time = convert24Hour(timeData); // time = '00:50'
시간은 60분 단위로 1시간씩 증가하기 때문에 단순 뺄셈으로 구하기에는 약간 복잡하기에, 다른 방식을 적용해야 합니다.
전체 시간을 총 n분으로 변환한 후, 그 n분 사이의 차이를 계산한 후, 다시 시간과 분으로 환산합니다.
위의 단계에 구체적인 시간을 적용하여 시간 차이를 계산해보도록 하겠습니다.
07:50
~ 13:33
다음과 같은 시간의 차이를 구한다고 생각해보세요.
1시간 = 60분
이 공식을 이용해, 먼저 시간을 분으로 변환합니다.
변환된 분에 분 부분을 더합니다.
const [startTimeHour, startTimeMinute] = '07:50'.split(':');
const [endTimehour, endTimeminute] = '13:33'.split(':');
const startTotalMinutes = parseInt(startTimeHour) * 60 + parseInt(startTimeMinute); // 470
const endTotalMinutes = parseInt(endTimeHour) * 60 + parseInt(endTimeMinute); // 813
2개의 n분 차이를 계산한 값을 1시간 = 60분
공식에 맞춰, 60으로 나누면 정확히 정수로 떨어지는 경우도 있고, 아닌 경우도 있을 겁니다.
따라서, 이 값을 Math.trunc
메서드를 이용해 소수점을 제외한 정수 부분만 가져오면 해당 값이 시간에 해당되겠죠?
분은 n분 차이 계산값(result) 에서 이 시간 값(hour)에 60을 곱한 값을 빼면 됩니다.
const result = endTotalMinutes - startTotalMinutes; // 343
const hour = Math.trunc(result / 60); // 5
const minute = result - hour * 60; // 43
// 결과: 5시간 43분
한가지 더 고려해야 할 부분이 있습니다.
앞서 언급한 계산법은 앞의 시간이 뒤의 시간보다 작을 때만 적용됩니다.
앞의 시간이 뒤의 시간보다 크게 되면 위와 같은 방식으로 시간 차이를 구할 수 없습니다.
예를 들면, 21:00
~ 07:00
과 같은 시간이 여기에 해당합니다.
21:00
이라면, 그 이전 날에 해당됩니다.
따라서, 24시간에서 이 시간만큼 뺀 후, 뒤의 시간을 더해줘야 합니다.
const [startTimeHour, startTimeMinute] = '21:00'.split(':');
const [endTimeHour, eondTimeMinute] = '07:00'.split(':');
const result = 24 * 60
- parseInt(startTimeHour) * 60 + parseInt(startTimeMinute)
+ parseInt(endTimeHour) * 60 + parseInt(endTimeMinute);
// 시간, 분으로 환산하는 코드는 이전과 동일함
const hour = Math.trunc(result / 60);
const minute = result - hour * 60;
interface Time {
hour: number;
minute: number;
}
interface TimeDiff {
(start: string, end: string): Time
}
const calcTimeDiff: TimeDiff = (start, end) => {
const startTotalMinutes = parseInt(start.slice(0, 2)) * 60 + parseInt(start.slice(3));
const endTotalMinutes = parseInt(end.slice(0, 2)) * 60 + parseInt(end.slice(3));
if (start < end) {
const timeDiff = endTotalMinutes - startTotalMinutes;
const hour = Math.trunc(timeDiff / 60);
const minute = timeDiff - hour * 60;
return { hour, minute };
}
if (start > end) {
const timeDiff = 24 * 60 - startTotalMinutes + endTotalMinutes;
const hour = Math.trunc(timeDiff / 60);
const minute = timeDiff - hour * 60;
return { hour, minute };
}
return { hour: 0, minute: 0 };
}