시간 차이 계산하기

이나리·2022년 7월 1일
0

다음과 같은 2개의 시간의 차이를 구하는 방법에 대해 알아보겠습니다.

  1. 12:50 AM ~ 07:20 AM
  2. 09:30 PM ~ 07:30 AM

24시간제로 변경하기

시간 데이터가 다음과 같이 문자열로 저장되어 있다고 가정하겠습니다.

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'

2개의 시간 간의 차이 구하기

시간은 60분 단위로 1시간씩 증가하기 때문에 단순 뺄셈으로 구하기에는 약간 복잡하기에, 다른 방식을 적용해야 합니다.

전체 시간을 총 n분으로 변환한 후, 그 n분 사이의 차이를 계산한 후, 다시 시간과 분으로 환산합니다.

위의 단계에 구체적인 시간을 적용하여 시간 차이를 계산해보도록 하겠습니다.
07:50 ~ 13:33 다음과 같은 시간의 차이를 구한다고 생각해보세요.

전체 시간을 총 n분으로 변환하기

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분 차이를 계산하고, 시간으로 환산하기

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 };
}

0개의 댓글