-
javascript UTC => 한국시간 구하기언어/Javascript 2024. 4. 8. 13:58
typescript를 사용하여 개발하고 있습니다.
UTC는 뭐고 KST는 뭐야?
프로그래밍을 하다보면 프로그램 시간이 현재 한국의 시간대와 다르단걸 알 수 있습니다. 제가 사용한 typescript의 기반이 되는 javascript는 시간에 대한 객체를 생성할 때 저는 Date 객체를 사용하게 됩니다. 이 때 new Date()가 반환하는 시간은 UTC죠. UTC는 Universal Time Coordinated의 약자로 국제표준시라고 할 수 있습니다. 이에 반해 우리나라를 포함해사 각 국가들은 그들의 로컬타임존을 사용합니다. (미국이나 캐나다와 같은 넓은 땅덩어리 보유국들은 타임존이 여러개이긴합니다) 우리나라는 KST, Korea Stanard Time 라는 타임존을 사용하고 있어요.KST는 UTC보다 9시간 빠른데요, 한국과 영국의 시차라고 쉽게 생각하시면됩니다.
만약 서비스가 다양한 국가에서 제공된다면 사용자별 타임존에 맞는 출력값이 나와야하기 때문에 시간변환은 필수라고 할 수 있겠죠?
그럼 위에서 말한 Date가 기본으로 제공하는 시간을 코드로 한 번 확인해볼까요?
지금 제가 글을 쓰는 시점은 한국시간으로 2024년 4월 3일 15시51분22초입니다.const todayUTC = new Date(); // 2024-04-03T06:51:22.287Z
new Date()를 통해 반환되는 값은 한국시간보다 9시간 빠른 오전 6시임을 확인할 수 있어요.
UTC -> KST로 변환하기
컴퓨터마다, 내가 사용하는 서버마다 로컬타임존은 다르게 설정되어있을거에요.그럼 UTC와 내 현재 개발환경의 시차는 어떻게 구할 수 있을까요?
이에 대해 깊이 들어가기전에 자바스크립트의 Date() 내장 객체에 대해 간단히 알아볼게요.
자바스크립트의 Date객체는 java.util.Date에 기반합니다. 다시말해 자바의 Date클래스와 닮은 점이 많은데요, 몇 가지 예를 들어볼게요.
- 월(month)가 0부터 시작한다
- 기본생성자를 제공하여 현재시간을 나타내는 객체를 생성한다
- toString() 메소드를 제공해 날짜와 시간을 문자열로 변환할 수 있다이러한 특성을 바탕으로 변환에서 사용되는 Date 객체에서 사용되는 내장함수와 변환방법을 알려드리겠습니다.
const todayUTC = new Date(); // 2024-04-03T06:51:22.287Z const todayUTC_millisec = todayUTC.getTime() const timeDifference = todayUTC.getTimezoneOffset() // -540 const koreaTime_millisec = todayUTC.getTime() - timeDifference * 60000
1. todayUTC는 기본 new Date()를 통해 Date객체를 새로 생성해줬을 때 출력되는 결과입니다. UTC 기준으로 출력되는 것을 확인할 수 있습니다.
2. javascript에서 시간의 계산은 millisecond로 하는게 정확합니다. ECMAScript에서 기본으로 제공하는 getTime() 메소드를 사용하여 todayUTC의 millisecond를 알아냅니다. 이 때 millisecond는 UTC에서 지정한 0월0일0시0분0초로 부터 몇 millisecond가 지났는지를 반환합니다.
3. getTimezoneOffset() 함수는 UTC와 로컬타임존의 시간차를 알려줍니다. 이 때 분으로 값을 반환합니다. 결과값으로 -540이 나왔다는 것은 현재 제 시스템시간(KST)가 UTC보다 540분이 앞서있다는 것이고 이는 곳 9시간이 이르다는것을 의미합니다. 위에서 말씀드린대로 9시간의 시차가 발생하죠.
4. 그렇다면 한국의 KST를 구하려면 어떻게 해야할까요? KST는 UTC에서 9시간을 뺀 값이며 계산은 millisecond로 진행하기 때문에 todayUTC.getTime()에서(timeDifference * 60000)을 해줍니다. 60000을 곱해준 이유는 1분이 60000밀리초 이기 때문입니다.
1분 = 60초
1초 = 1000 밀리초
1분 = 60000 밀리초여기서 주의할게 있습니다.
const koreaTime = new Date(koreaTime_millisec)
millisecond를 new Date() 객체에 담아 출력하면 다시 로컬타임존으로 세팅이 된다는것이죠.즉, 이미 계산된 millisecond를 다시 한국시간으로 변환하는 꼴이됩니다.
-540분을 두 번 더한다고 보시면 돼요.
그래서 여기에도 문제가 있다는걸 깨닫게되고,
조금 노가다긴 하지만 직접 포맷팅하는 방법을 채택했습니다.
const fmDate = new Date() const year = fmDate.getFullYear(); const month = String(fmDate.getMonth() + 1).padStart(2, '0'); const day = String(fmDate.getDate()).padStart(2, '0'); const hours = String(fmDate.getHours()).padStart(2, '0'); const minutes = String(fmDate.getMinutes()).padStart(2, '0'); const seconds = String(fmDate.getSeconds()).padStart(2, '0'); const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
참고
반응형'언어 > Javascript' 카테고리의 다른 글
JS 명령어 (0) 2024.04.11 for문대신 사용할 수 있는 문법 - map / filter / every (0) 2023.09.08 npm build / npm run / npm start / npm eject 차이 (0) 2023.09.08 npm build / npm run / npm start / npm eject 차이 (0) 2023.09.05 [typescript]class-validator 에러 처리 (0) 2023.09.01