【Spring Boot】Date형의 값이 9시간 어긋났을 때에 확인·대응한 것 정리

6039 단어 spring-boot
Spring Boot로 구현을 진행하고 있었는데, Date형의 값이 상정치-9시간이 되어 버렸습니다.
그 때에 확인&대응한 것의 정리입니다.

환경


  • OS:Windows10
  • IDE: Eclipse2020-03
  • Java: 11
  • MySQL : 5.7
  • Spring Boot: 2.3.2

  • 전제 사항


  • 일본 표준시에 설정하는 것으로 합니다.

  • 확인 내용



    1. DB의 시간대 설정 확인



    대상의 값이 DB 유래인 경우는 우선, DB의 설정이 올바르게 되어 있는지 확인합시다.
    다음과 같이 show variables 명령을 실행합니다.

    실행 명령 및 결과
    
    > show variables like '%time_zone%';
    +------------------+------------+
    | Variable_name    | Value      |
    +------------------+------------+
    | system_time_zone | UTC        |
    | time_zone        | Asia/Tokyo |
    +------------------+------------+
    

    일본 표준시의 경우 time_zone이 Asia/Tokyo로 설정되어 있어야 합니다.
    (default의 경우 system_time_zone의 값을 참조합니다.)
    다른 경우 설정 파일 my.cnf의 내용을 다음과 같이 변경합시다.

    /etc/my.cnf
    [mysqld]
    default-time-zone = 'Asia/Tokyo'
    

    설정이 완료되면 다음 명령을 실행하여 일본 표준시에서 현재 시간을 얻을 수 있는지 확인합니다.

    현재 시간 확인 명령
    select now();
    

    2. 애플리케이션 서버의 시간대 설정 확인



    대상의 값이 DB 유래가 아니거나, DB의 설정에 문제가 없었던 경우는 어플리케이션 서버의 타임 존을 확인합시다.
    가장 빠른 방법은 예를 들면 다음과 같은 코드를 추기해 콘솔에 서버의 현재 시각을 출력시키는 방법입니다.

    현재 시간 출력 코드
    System.out.println("現在の時刻は" + new Date() + "です。");
    

    위에서 가정한 결과를 얻지 못하면 환경 변수를 설정합니다.

    (1) Eclipse를 사용하여 프로젝트를 시작하는 경우



    다음 절차에 따라 서버의 시간대를 설정합니다.

    ① Eclipse의 메뉴 바에서 「실행」(①) > 「실행 구성」(②)을 선택.


    ② Spring Boot 어플리케이션의 대상의 앱을 선택하고(①), 인수 탭에서(②) VM 인수란에 「-Duser.timezone=JST」라고 기재하고(③), 「적용」을 누름(④)


    (2) 서버에서 부팅하는 경우



    jar 파일과 같은 계층에, 「jar 파일의 이름.conf」라고 하는 이름으로 설정 파일을 작성해, 설정 내용을 기술.
    jar 파일의 이름이 hoge.jar이면 다음과 같습니다.

    hoge.conf
    JAVA_OPTS="-Duser.timezone=Asia/Tokyo";
    

    설정이 완료되면 재부팅하여 시간이 올바르게 설정되었는지 확인합니다.

    3. 애플리케이션 등록 정보 파일의 Jackson 시간 설정 확인



    상기 1, 2에서도 상정의 결과를 얻을 수 없었던 경우는 어플리케이션 프로퍼티 프로퍼티 파일에 이하의 기술을 추가해 봅시다.

    application.yml
    spring:
      jackson:
        dateFormat: yyyy-MM-dd HH:mm:ss
        time-zone: Asia/Tokyo
    

    dateFormat의 부분은 임의.
    표시할 형식을 설명합니다.

    여담입니다만, 소스 코드로 개별적으로 형식 변경하는 것도 가능!
    예를 들면 다음과 같이 기술하면, 「yyyy/MM/dd」형식이 됩니다.
    @JsonFormat(pattern = "yyyy/MM/dd")
    private Date createdAt;
    

    끝에



    처음 무엇이 원인으로 시간이 어긋나고 있는지 모르고, 매우 당황했습니다.
    차례로 확인하는 것으로 원인까지 따랐습니다!

    그 밖에도 시간이 어긋나는 요소가 있으면, 꼭 가르쳐 주세요!

    참고



    1. DB의 시간대 설정 확인


  • MySQL에서 시간대 설정하기 | Qiita
  • MySQL Now 함수(현재 시각, 일시를 취득) | 프로그래밍 입문 사이트 ~bituse~

  • 2. 애플리케이션 서버의 시간대 설정 확인


  • Java 날짜형의 타임 존이 GMT(-9시간)가 되어 버리는 버그의 해결 방법 - Date, Calendar |
  • 【Java・SpringBoot】eclipse(STS)로 기동하는 서버의 타임 존을 변경하는 방법(JST->UTC) | 지방에 이사 예정의 30세 남자가 프로그래머를 계속하기 위한 블로그
  • Spring Boot로 만든 웹 앱 시간이 영국 시간이 되었을 때는 ... | jildin workers
  • Tomcat의 시간대 설정 (Eclipse) | 느슨한 엔지니어 블로그

  • 3. 애플리케이션 등록 정보 파일의 Jackson 시간 설정 확인


  • Spring Boot의 Jackson 시간 설정 요약 | hogepiyo 엔지니어링
  • Java에서 Date를 ISO 8601 확장 형식으로 출력하기 | Qiita
  • 좋은 웹페이지 즐겨찾기