← 모두의 툴

글로벌 회의 시간 추천, UTC 자정을 넘는 구간은 어떻게 합치나

가이드 · 2026.08.20 최종 확인

여러 나라에 흩어진 팀원의 근무 가능 시간을 겹쳐서 회의 시간을 추천하는 도구를 만들 때 가장 먼저 걸려 넘어지는 지점은 "자정"입니다. 하루는 0시부터 23시까지 24개 칸으로 표현되는데, 오프셋이 큰 도시(호주·뉴질랜드처럼 UTC+10 이상, 혹은 미국 서부처럼 UTC-8 이하)는 로컬 근무 시간을 UTC로 환산하면 23시에서 0시로 넘어가는 경계를 그대로 통과합니다. 이 경계를 숫자 범위 비교(start ≤ x ≤ end)로만 처리하면 "23~24시"와 "0~5시"가 서로 다른 두 구간으로 쪼개져 보이는 문제가 생깁니다. 시간대 회의 플래너의 실제 코드가 이 문제를 어떻게 푸는지 뜯어봅니다.

1. 로컬 시간을 UTC로 바꾸는 첫 단계

도구는 참여자마다 도시(=UTC 오프셋)와 로컬 근무 시간(기본 9~18시)을 입력받습니다. 그다음 UTC 0시부터 23시까지 24칸을 순회하면서 각 시각을 로컬 시간으로 환산합니다. 코드는 let local = utc + off; if (local < 0) local += 24; if (local >= 24) local -= 24; 형태로, 오프셋을 더한 값이 0 미만이거나 24 이상이면 24를 더하거나 빼서 0~23 범위 안으로 되돌립니다. 이는 나머지 연산(mod 24)과 동일한 효과를 손으로 푼 것으로, 하루가 24시간마다 순환한다는 사실을 코드 레벨에서 명시적으로 처리하는 부분입니다. 이 한 줄이 없으면 UTC+12 도시의 새벽 시간이 로컬 26시, 27시 같은 존재하지 않는 값으로 계산돼버립니다.

2. 겹치는 시간을 찾는 방식: 정수 배열 스캔

변환이 끝나면 각 참여자마다 24칸짜리 불리언 배열(근무 중이면 true)이 생기고, UTC 0~23시 각각에 대해 "모든 참여자가 동시에 근무 중인가"를 검사해 2(전원 근무), 1(일부만 근무), 0(전원 비근무)으로 표시합니다. 그다음 값이 2인 시각들만 순서대로 모아 overlapSlots 배열을 만들고, 인접한 시각끼리 하나의 그룹으로 묶습니다. 여기까지는 흔한 "연속 구간 찾기" 알고리즘과 다르지 않습니다. 문제는 겹치는 구간이 정확히 23시와 0시 사이를 걸칠 때입니다 — 배열을 0시부터 23시까지 순서대로 스캔하기 때문에 23시는 맨 마지막 그룹에, 0시는 맨 첫 그룹에 각각 따로 담기고 맙니다.

3. 자정 경계 병합: 두 그룹을 하나로 잇는 특수 처리

이 도구는 일반적인 "24시간 순환 구조를 처음부터 원형으로 다루는" 알고리즘 대신, 훨씬 단순한 특수 케이스 하나만 검사합니다. 그룹이 2개 이상이고, 첫 번째 그룹이 0시에서 시작하고, 마지막 그룹이 23시에서 끝난다면 — 이 두 그룹은 사실 자정을 사이에 두고 이어지는 하나의 연속 구간이라고 판단해 groups[0] = last.concat(first)로 합칩니다. 하루의 원이 자정이라는 이음매(seam)를 딱 한 번만 가진다는 점을 이용해, "원형 배열을 처음부터 원형으로 순회"하는 복잡한 구현 대신 "마지막 조각과 첫 조각을 사후에 이어 붙이는" 더 간단한 방식으로 같은 결과를 냅니다.

왜 이 특수 처리 하나로 충분한가: 겹치는 시간이 자정을 넘어 이어지는 경우는 하루에 최대 한 번뿐입니다(자정이 유일한 경계이므로). 따라서 "0시로 시작하는 그룹"과 "23시로 끝나는 그룹"이 동시에 존재하는 상황은 곧 그 둘이 원래 하나였다는 뜻이고, 이 조건 하나만 확인하면 일반적인 원형 구간 병합 로직을 따로 짤 필요가 없습니다.

4. 실전 예시: 시드니-오클랜드 팀의 겹치는 시간

실제 도구의 도시 목록(ZONES)에 있는 시드니(AEST, UTC+10)와 오클랜드(NZST, UTC+12)를 예로 들어, 기본 근무시간(로컬 9~18시)으로 UTC 환산 결과를 계산하면 다음과 같습니다.

UTC 시각시드니 로컬(+10)오클랜드 로컬(+12)겹침?
21시07시(근무 전)09시(근무 시작)-
22시08시(근무 전)10시-
23시09시(근무 시작)11시
0시10시12시
1~5시11~15시13~17시
6시16시18시(근무 종료)-

이 계산대로면 스캔 순서상 원시 그룹은 [0,1,2,3,4,5]와 [23] 두 개로 분리되지만, 첫 그룹이 0시에서 시작하고 마지막 그룹이 23시에서 끝나므로 병합 조건이 성립해 하나의 그룹 [23,0,1,2,3,4,5]로 합쳐집니다. 화면에는 끊긴 두 조각이 아니라 "UTC 23:00 – 6:00" 하나의 추천 슬롯으로 표시됩니다. 시간대 변환기로 각 도시의 로컬 시각을 직접 대조해봐도 같은 결과를 확인할 수 있습니다.

5. 이 방식의 한계: 서머타임은 계산에서 빠진다

이 도구는 도시 목록에 고정된 표준 오프셋만 사용하고 서머타임(DST)은 반영하지 않습니다. 예를 들어 파리는 항상 CET(+1)로 계산되지만 서머타임 기간엔 실제로 CEST(+2)이므로, 서머타임을 쓰는 나라와의 회의에서는 실제 시차가 1시간 어긋날 수 있습니다. 정확한 현재 시각이나 UTC 타임스탬프 자체가 필요하다면 Epoch 변환기타임스탬프 변환기를 함께 쓰는 것이 안전합니다. 또한 겹치는 시간이 아예 없을 경우, 특정 팀원이 매번 이른 아침·늦은 밤을 떠안지 않도록 돌아가며 시간대를 양보하는 방식이 권장됩니다.

자주 묻는 질문

Q. 단순히 "23시 이상 또는 0~5시 이하"라는 OR 조건으로 처리하면 안 되나요?

A. 조건 자체는 맞게 판정되지만, 문제는 "연속 구간을 하나의 슬롯으로 묶어 보여주는" 표시 단계입니다. OR 조건만으로는 23시 그룹과 0~5시 그룹이 여전히 별개의 배열로 남기 때문에, 화면에 끊긴 두 개의 추천 슬롯으로 나뉘어 나타납니다. 마지막 그룹과 첫 그룹을 사후에 이어 붙이는 병합 단계가 따로 필요한 이유입니다.

Q. 겹치는 그룹이 3개 이상이어도 이 방식이 통하나요?

A. 네. 병합은 "첫 그룹이 0시에서 시작하는지"와 "마지막 그룹이 23시에서 끝나는지"만 확인하므로, 중간에 다른 겹침 그룹이 몇 개 있든 상관없이 자정을 걸친 두 조각만 정확히 하나로 합쳐집니다.

Q. 회의 시간이 겹치지 않으면 어떻게 하나요?

A. 도구는 "겹치는 근무 시간 없음"을 표시합니다. 이 경우 실시간 회의보다 문서·이슈 트래커 기반 비동기 협업이 더 나을 수 있으며, 굳이 실시간으로 만나야 한다면 이른 아침·늦은 밤 회의를 팀원끼리 돌아가며 맡는 것이 좋습니다.

Q. 서머타임 적용 국가와 회의할 때는 어떻게 보정하나요?

A. 이 도구는 표준 오프셋 고정값만 쓰므로, 서머타임 기간에는 실제 시차가 1시간 다를 수 있다는 점을 감안해 상대측에 현재 오프셋을 직접 확인하거나 시간대 변환기로 그날 기준 실제 로컬 시각을 다시 대조하는 것이 안전합니다.