LocalDateTime.now() 함수의 시간대가 다르게 나오는 문제 해결

백종현·2023년 5월 25일
0

문제

LocalDateTime dateTime = LocalDateTime.now();
... 중략
if (nowDateTime.before(startDateTime) || nowDateTime.after(endDateTime)) {
     ... 중략
}

Java 코드에서 위와 같이 현재시간과 화장실 OpenTime 비교해 열었는지 안 열었는지를 알려주는 로직을 사용하고 있었는데, 로컬 환경에서는 이게 잘 돌아갔으나, EC2 ubuntu 환경만 가면 이 로직이 이상하게 되지를 않았다. 그래서 먼저 EC2 환경에서 로그를 찍어보았다.

실제로 한국의 현재 시간이 11:43이었는데, 아래와 같이 LocalDateTime.now()의 함수를 실행하니 02:43으로 찍히게 되었다.

그래서 추측하기로는, 아마 LocalDateTime.now();라는 함수는 OS에 종속적인 시스템 콜 함수를 불러서 가져올 것이라고 판단하였고, 현재 EC2 ubuntu 환경은 default timedate가 한국이 아닐 것으로 판단하였다. 그리고 로컬 환경이 잘 되는 이유는, 로컬 환경의 timedate가 아래 사진과 같이 한국이기 때문일 것이라고 생각했다.

그리고 이 주장에 확신을 얻기위해 LocalDateTime.now();라는 함수는 OS에 종속적인 시스템 콜 함수를 부르는지를 한번 확인해보았다.

역시나 추측이 맞았다. LocalDateTime.now()은 결국 currentTimeMillis() 함수를 부르게 되는데, 이 함수는 시스템 콜 함수이고, 위의 주석 내용을 보면 OS에 종속적이다라는 말이 적혀있었다.

해결

이를 해결하는 방법은 여러가지였는데, 먼저 애플리케이션 단에서 해결하는 방법이 있었다. 하지만 이를 선택하지는 않았다. EC2 ubuntu OS에서 시간대를 바꿔 해결하기로 했다.

timedatectl

이를 통해 확인해보았더니, 실제로 한국 서울 환경이 아니었다. 따라서 아래 명령어를 통해 시간대를 바꿨다.

sudo timedatectl set-timezone Asia/Seoul # 시간을 seoul시간으로 바꿈
sudo timedatectl set-ntp true # 적용
timedatectl

적용을 한 후, timedatectl을 찍어 다시 확인해보았다. 잘 바뀐 것을 확인했다.

애플리케이션 단에서도 LocalDateTime dateTime = LocalDateTime.now();을 실행할 때 제대로 시간을 가져와 이 문제를 해결하였다.

profile
노력하는 사람

0개의 댓글