피드로 돌아가기
You Probably Don't Need a Timezone Library Anymore
Dev.toDev.to
Frontend

Intl API와 Skip-forward 알고리즘으로 @yearly 연산 2ms 달성

You Probably Don't Need a Timezone Library Anymore

SEN LLC2026년 4월 10일7intermediate

Context

기존 JavaScript 환경의 Timezone 처리를 위해 moment-timezone 등 100KB 이상의 무거운 외부 라이브러리에 의존하던 구조적 한계 존재. 특히 Cron 표현식의 다음 실행 시간을 계산할 때 분 단위 단순 루프를 수행하여 @yearly 같은 저빈도 스케줄링 시 브라우저 메인 스레드가 점유되는 성능 병목 발생.

Technical Solution

  • Intl.DateTimeFormat의 formatToParts 및 hourCycle: 'h23' 옵션을 활용하여 외부 라이브러리 없는 IANA Timezone 데이터베이스 직접 참조 구조 설계
  • 단순 반복 루프 대신 현재 매칭되지 않는 가장 큰 시간 단위(Month -> Day -> Hour)를 계산하여 다음 유효 구간으로 즉시 이동하는 Skip-forward 알고리즘 도입
  • 시간 단위 점프 시 현재의 하위 시간 값(Minute, Hour)을 차감하여 다음 단위의 00분/00시 정각에 정확히 도달하도록 보정하는 정밀 포인터 제어 로직 구현
  • DOM 의존성을 완전히 제거한 Pure Function 기반의 Parser 및 NextRun Calculator 설계로 테스트 용이성 및 실행 속도 확보
  • Zero-dependency 및 Build-step 없는 Vanilla JS 구조를 통한 런타임 오버헤드 최소화

- Timezone 처리 시 라이브러리 도입 전 Intl.DateTimeFormat의 기능 범위 확인 - 주기적 이벤트 계산 로직 설계 시 단순 루프가 아닌 단위별 Skip-forward 로직 적용 여부 검토 - 시간 단위 전이(Transition) 발생 지점에 대한 경계 값 테스트 케이스 확보

원문 읽기