최근 일하면서 특정 시간대에만 배너를 표시하는 작업을 한 일이 있었다. 당연히 쉽게 반영이 될 거라고 생각했는데, 실제 사이트에서는 마치 코드가 잘못된 것처럼 작동하지 않았다. 이유는 기업 서버가 미국(혹은 다른 나라)을 거쳐 가면서 new Date() 시간이 한국 시간이 아닌 다른 어딘가의 시간으로 출력됐던 것이었고, 이 때문에 항상 한국 기준 (UTC +8)으로 바꿔주는 작업이 필요했다.
소스코드
const now = new Date() // 서버 시간 기준 현재 로컬 시간
const GMTNow = now.getTime() + now.getTimezoneOffset() * 60 * 1000 // GMT 현재 시간
// now.getTime(): 1970년 1월 1일 00:00:00 GMT와 주어진 날짜까지의 시간을 밀리세컨드로 반환한다.
// now.getTimezoneOffset(): GMT 시간과 현지 시간의 차이를 분으로 반환한다. 시간이 더 앞에 있으면 음수가 된다.
const KoreaTimeDiff = 9 * 60 * 60 * 1000 // 한국 시간은 GMT 시간보다 9시간 앞서 있다.
const KoreaNow = new Date(GMTNow + KoreaTimeDiff) // GMT 기준 한국 시간을 최종적으로 만들어 준다.
1. new Date(), .getTime(), .getTimezoneOffset()으로 GMT 기준 현재 시간 구하기
JS Date() 생성자에 아무 인자도 담지 않고 new 연산자를 사용해 Date 객체를 생성하면, GMT(그리니치 평균시) 기준 시간으로 서버 시간 기준 날짜와 시간을 반환한다. UTC(협정 세계시)가 일반적으로 사용되는데, JS는 독특하게 GMT를 사용하고 있다고 한다. 그러나 초의 소숫점 단위에서만 차이가 나기 때문에 혼용해서 사용해도 관계 없다고 한다.
getTime() 함수는 Date 객체가 1970년 1월 1일 00:00:00(GMT)를 기점으로 몇 밀리초 떨어져 있는지를 반환한다. 그러니까 시간의 선후와 대소를 비교할 떄 유용하게 쓸 수 있다.
그래서 const GMTNow = now.getTime() + now.getTimezoneOffset() * 60 * 1000 와 같이 써주면, GMT 기준의 현재 시간에 .getTime()을 해 준 만큼의 밀리초가 GMTNow 변수에 담긴다.
2. 한국 시간이 GMT 기준 +9시간인 것을 이용해 현재 한국 시간 구하기
이제 GMT 기준 +9시간 만큼의 밀리초를 GMTNow에 더해주면, 언제, 어디서 접속하든 한국 시간 기준의 시간에 .getTime()을 해준 것과 같은 값을 만들 수 있다. 따라서 GMTNow에 9 * 60 * 60 * 1000의 값을 더해 준 값을 최종적으로 사용할 변수에 담아 주면 끝이다.
'Programming > Javascript, Typescript' 카테고리의 다른 글
[HTML, JS] onClick="location.href='주소'" (0) | 2023.03.17 |
---|---|
Promise.all, 무엇이고 언제 사용해야 할까? (0) | 2023.03.06 |
[JavaScript] 화살표 함수 (0) | 2023.02.09 |
[Javscript] window.scrollTo() 메서드 (0) | 2023.01.03 |
[Javascript] reduce() 함수 (0) | 2023.01.02 |
댓글