SpringBoot 에서 시간 을 포맷 하 는 다섯 가지 방법 을 모 았 습 니 다.

머리말
우리 의 일상 업무 에서 시간 포맷 은 자주 발생 하 는 일이 기 때문에 본 고 는 Spring Boot 에서 시간 포맷 의 몇 가지 방법 을 살 펴 보 자.
시간 문제 데모
프 리 젠 테 이 션 을 편리 하 게 하기 위해 저 는 간단 한 Spring Boot 프로젝트 를 썼 습 니 다.그 중에서 데이터베이스 에 userinfo 표 가 포함 되 어 있 습 니 다.그 구성 구조 와 데이터 정 보 는 다음 과 같 습 니 다.

프로젝트 디 렉 터 리 는 다음 과 같 습 니 다:

UserController 구현 코드 는 다음 과 같 습 니 다.

@RestController
@RequestMapping("/user")
publicclass UserController {
    @Resource
    private UserMapper userMapper;

    @RequestMapping("/list")
    public List<UserInfo> getList() {
        return userMapper.getList();
    }
}

UserMapper 구현 코드 는 다음 과 같 습 니 다.

@Mapper
publicinterface UserMapper {
    public List<UserInfo> getList();
}
UserInfo 구현 코드 는 다음 과 같 습 니 다.

@Data
publicclass UserInfo {
    privateint id;
    private String username;
    private Date createtime;
    private Date updatetime;
}
UserMapper.xml 구현 코드 는 다음 과 같 습 니 다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="getList" resultType="com.example.demo.model.UserInfo">
        select * from userinfo
    </select>
</mapper>
이상 의 내용 의 작성 을 통 해 우 리 는 간단 한 Spring Boot 프로젝트 를 만 들 었 다.다음은 PostMan 을 사용 하여 UserController 인 터 페 이 스 를 모 의 호출 합 니 다.실행 결 과 는 다음 과 같 습 니 다.

상기 결 과 를 통 해 알 수 있 듯 이 시간 필드 createtime 과 updatetime 의 디 스 플레이 방식 은 매우'난잡 하 다'는 것 을 알 수 있 습 니 다.우리 의 읽 기 습관 에 부합 되 지 않 고 전단 의 사용자 에 게 직접 보 여 줄 수도 없습니다.이 럴 때 우 리 는 시간 을 포맷 처리 해 야 합 니 다.
시간 포맷 방법 은 모두 다음 과 같은 5 가 지 를 포함한다.
1.전단 시간 포맷
만약 백 엔 드 가 회사 에서 절대적 인 발언권 을 가지 고 있 거나 백 엔 드 가 비교적 강 한 상황 에서 우 리 는 시간 을 포맷 한 이'냄비'를 강제로 프론트 엔 드 에 던 져 처리 할 수 있다.
이'냄비'를 좀 더 평평 하 게 떨 어 뜨리 기 위해 서(레이 형 이 요리사 가 되 지 않 는 것 이 아 쉽 습 니 다)우 리 는 전단 엔지니어 에 게 실행 가능 한 시간 포맷 방법 을 제공 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다.
JS 버 전 시간 포맷

function dateFormat(fmt, date) {
    let ret;
    const opt = {
        "Y+": date.getFullYear().toString(),        //  
        "m+": (date.getMonth() + 1).toString(),     //  
        "d+": date.getDate().toString(),            //  
        "H+": date.getHours().toString(),           //  
        "M+": date.getMinutes().toString(),         //  
        "S+": date.getSeconds().toString()          //  
        //                 ,        
    };
    for (let k in opt) {
        ret = newRegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}
방법 호출:

let date = newDate();
dateFormat("YYYY-mm-dd HH:MM:SS", date);

>>> 2021-07-2521:45:12

2.SimpleDateFormat 포맷
대부분의 경우 우 리 는 자력갱생 을 해 야 합 니 다.문 앞의 눈 을 쓸 어야 합 니 다.이 럴 때 백 엔 드 프로그래머 들 은 자신의 특 기 를 발휘 해 야 합 니 다.우리 가 제공 하 는 첫 번 째 시간 포맷 방법 은 Simple DateFormat 을 사용 하여 시간 포맷 을 하 는 것 입 니 다.이것 도 JDK 8 이전의 중요 한 시간 포맷 방법 입 니 다.그 핵심 실현 코드 는 다음 과 같 습 니 다.

//                  
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        
String date = dateFormat.format(new Date())
다음은 Simple DateFormat 을 사용 하여 이 프로젝트 의 시간 포맷 을 실현 합 니 다.이 구현 코드 는 다음 과 같 습 니 다.

@RequestMapping("/list")
public List<UserInfo> getList() {
    //          
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    List<UserInfo> list = userMapper.getList();
    //          
    list.forEach(item -> {
        //        ctime    createtime       (Date->String)
        item.setCtime(dateFormat.format(item.getCreatetime()));
        item.setUtime(dateFormat.format(item.getUpdatetime()));
    });
    return list;
}
프로그램 실행 결 과 는 다음 과 같 습 니 다.

이 같은 결 과 를 통 해 시간 포맷 에 문제 가 없 으 며 우리 가 예상 한 목적 이 무엇 인지 알 수 있다.그러나 세심 한 독자 들 은 왜 인터페이스의 반환 필드 가 어떻게 변 했 는 지 발견 할 수 있 을 것 이다.이전 필드 는 createtime 이 었 는데 지금 은 ctime...)
이 는\#Simple DateFormat.format 방법 을 사용 한 후 String 형식의 결 과 를 되 돌려 주 었 기 때 문 입 니 다.이전 createtime 과 updatetime 필드 는 Date 형식 이 었 기 때문에 시간 포맷 결 과 를 받 아들 일 수 없습니다.
따라서 이 때 우 리 는 실체 류 User Info 에 두 문자열 형식의'시간'필드 를 추가 하고 이전 Data 형식의 시간 필드 를 숨겨 야 합 니 다.최종 실체 류 User Info 의 실현 코드 는 다음 과 같 습 니 다.

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import java.util.Date;

@Data
publicclass UserInfo {
    privateint id;
    private String username;
    @JsonIgnore//           
    private Date createtime;
    //          
    private String ctime;
    @JsonIgnore//           
    private Date updatetime;
    //          
    private String utime;
}

저 희 는@JSonIgnore 주 해 를 사용 하여 필드 를 숨 길 수 있 습 니 다.숨겨 진 실행 결 과 는 다음 과 같 습 니 다.

3.DateTimeFormatter 포맷
JDK 8 이후 에는 Simple DateFormatter 대신 DateTimeFormatter 를 사용 할 수 있 습 니 다.Simple DateFormatter 는 비 스 레 드 가 안전 하고 DateTimeFormatter 는 스 레 드 가 안전 하기 때문에 JDK 8 이상 의 항목 이 라면 가능 한 DateTimeFormatter 를 사용 하여 시간 포맷 을 할 수 있 습 니 다.
DateTimeFormatter 포맷 된 코드 는 Simple DateFormat 과 유사 하 며 구체 적 으로 다음 과 같 습 니 다.

@RequestMapping("/list")
public List<UserInfo> getList() {
    //          
    DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    List<UserInfo> list = userMapper.getList();
    //          
    list.forEach(item -> {
        //        ctime    createtime       (Date->String)
        item.setCtime(dateFormat.format(item.getCreatetime()));
        item.setUtime(dateFormat.format(item.getUpdatetime()));
    });
    return list;
}
실행 결 과 는 다음 과 같다.

DateTimeFormatter 와 Simple DateFormatter 의 사용 상의 차 이 는 DateTimeFormatter 는 JDK 8 이 제공 하 는 시간 형식 을 포맷 하 는 데 사 용 됩 니 다.예 를 들 어 LocalDateTime,Simple DateFormat 은 Date 형식 을 포맷 하 는 데 사 용 됩 니 다.따라서 우 리 는 UserInfoer 실체 류 에 대해 다음 과 같은 수정 을 해 야 합 니 다.

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import java.time.LocalDateTime;

@Data
publicclass UserInfo {
    privateint id;
    private String username;
    @JsonIgnore
    private LocalDateTime createtime;
    private String ctime;
    @JsonIgnore
    private LocalDateTime updatetime;
    private String utime;
}

우 리 는 LocalDateTime 을 사용 하여 MySQL 의 datetime 형식 을 받 을 수 있 습 니 다.
4.전역 시간 포맷
상기 두 가지 백 엔 드 포맷 의 실현 은 모두 치 명 적 인 단점 이 있 습 니 다.그들 은 시간 포맷 을 할 때 핵심 업무 류 에 대해 일정한 수정 을 해 야 합 니 다.이것 은 하나의 문 제 를 해결 하기 위해 새로운 문 제 를 도입 한 것 입 니 다.그러면 간단 하고 우아 한 해결 방안 이 있 습 니까?
정 답 은 있다.우 리 는 어떠한 코드 도 바 꾸 지 않 고 설정 파일 에 만 설정 하면 시간 포맷 기능 을 실현 할 수 있 습 니 다.
우선,Spring Boot 의 프로필 application.properties(또는 application.yml)를 찾 았 습 니 다.application.properties 프로필 에 다음 두 줄 의 설정 만 추가 하면 됩 니 다.
\#전역 시간 필드 포맷
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
\#시간 영역 형식 지정
spring.jackson.time-zone=GMT+8
이렇게 설정 하면 원본 UserInfo 와 UserController 를 복원 합 니 다.
UserInfo 구현 코드 는 다음 과 같 습 니 다.

import lombok.Data;
import java.util.Date;

@Data
publicclass UserInfo {
    privateint id;
    private String username;
    private Date createtime;
    private Date updatetime;
}

UserController 구현 코드:

@RequestMapping("/list")
public List<UserInfo> getList() {
    return userMapper.getList();
}
그리고 프로그램 을 실행 합 니 다.보 이 는 실행 결 과 는 다음 과 같 습 니 다.

상기 결과 와 코드 를 통 해 알 수 있 듯 이 우 리 는 프로그램 에서 간단하게 설정 하면 모든 시간 필드 의 포맷 을 실현 할 수 있다.
실현 원리 분석
왜 프로필 에 설정 하면 모든 시간 필드 의 포맷 을 실현 할 수 있 습 니까?
\#전역 시간 필드 포맷
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
\#시간 영역 형식 지정
spring.jackson.time-zone=GMT+8
Controller 가 데 이 터 를 되 돌 릴 때 Spring Boot 프레임 에 내 장 된 JSON 프레임 워 크 Jackson 을 자동 으로 호출 하여 되 돌아 오 는 데 이 터 를 통일 적 으로 JSON 포맷 처리 하기 때 문 입 니 다.처리 하 는 과정 에서 설정 파일 에'spring.jackson.date-format=yyy-MM-dd HH:mm:ss'가 설정 되 어 있 는 지 판단 합 니 다.설정 되 어 있 으 면,그러면 Jackson 프레임 워 크 는 시간 형식의 필드 를 출력 할 때 시간 포맷 처 리 를 실행 합 니 다.그러면 우 리 는 설정 을 통 해 전체 시간 필드 의 포맷 기능 을 실현 합 니 다.
시간 영역 유형'spring.jackson.time-zone=GMT+8'을 지정 하 는 이 유 는 무엇 입 니까?
가장 현실 적 인 이 유 는 우리 가 시간 대 유형 을 지정 하지 않 으 면 조회 하 는 시간 이 예상 보다 8 시간 이 적 기 때문이다.이것 은 우리(중국)가 처 한 시간 대 는 세계 시간 보다 8 시간 이 적어 서 생 긴 것 이다.우리 가 시간 대 를 설정 한 후에 야 우리 의 시간 조 회 는 예상 시간 과 일치 할 수 있다.
GMT 가 뭐 예요?
시간 대 설정 중의"GMT"는 무슨 뜻 입 니까?
그리니치 메 인 타임(GMT)그리니치 타임 은 세계 시간 이 라 고도 부른다.
그리니치 시간
그리니치 는 영국 런던 남 교 원 로 열 그리니치 천문대 가 있 는 곳 으로 지구 본 초 자오선 의 경계 에 위치 하고 세계 가 시간 과 경 도 를 계산 하 는 출발점 이다.해사 역사,본 초 자오선 의 기준점,그리고 그리니치 시간 으로 유명 하 다.이곳 은 지세 가 험준 하고 경치 가 수려 하 며 역사 와 지방 정 취 를 겸비 하고 있 으 며 런던 이 타 임 스 강 에 있 는 동방 의 관문 이기 도 하 다.
천문학 자 들 이 그리니치 시간 을 사용 하 는 것 뿐만 아니 라 신문 에서 도 이 명사 가 자주 등장 한다.우 리 는 각지 에 모두 각지 의 시간 이 있다 는 것 을 안다.국제 적 으로 어떤 중대 한 일 을 지방 시간 으로 기록 하면 복잡 하고 불편 하 며 앞으로 날 이 길 어 지면 잘못 되 기 쉽다.그래서 천문학 자 들 은 모두 가 받 아들 일 수 있 고 편리 한 기록 방법 을 제시 했다.그것 이 바로 그리니치 의 지방 시간 을 기준 으로 하 는 것 이다.
본 초 자오선 의 평 자야 로 계산 한 평 태양시.그리니치 평소 나 그리니치 시간 이 라 고도 부른다.각지 의 지방 은 평소 세계 와 의 차 이 는 그 지역 의 지리 경도 와 같다.1960 년 이전에 기본 시간 계량 시스템 으로 광범 위 하 게 응용 되 었 다.지구의 자전 속 도 는 균일 하 다 고 여 겨 졌 기 때문에 1960 년 이전에 세 계 는 균일 할 때 로 여 겨 졌 다.지구 자전 속도 변화의 영향 으로 인해 그것 은 균일 한 시간 시스템 이 아니 라 원자 시 나 역학 시 와 어떠한 이론 적 인 관계 도 없 으 며 관측 을 통 해 만 그것들 을 비교 할 수 있다.나중에 세 계 는 선후 로 역서 시 와 원자 시 에 대체 되 었 으 나 일상생활,천문 항 법,대지 측량 과 우주 비행 등에 있어 아직도 필요 하 다.이 동시에 세 계 는 지구 자전 속도 의 변 화 를 반영 하고 지구 자전 매개 변수 중 하나 로 천문학 과 지구 물리학 의 기본 자료 이다.
5.부분 시간 포맷
어떤 장면 에서 우 리 는 전체적인 시간 을 통일 적 으로 처리 할 필요 가 없다.이런 상황 에서 우 리 는 주석 방식 으로 일부 시간 필드 의 포맷 을 실현 할 수 있다.
우 리 는 실체 클래스 User Info 에@JSonFormat 주 해 를 추가 해 야 합 니 다.그러면 시간의 포맷 기능 을 실현 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다.

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.util.Date;

@Data
publicclass UserInfo {
    privateint id;
    private String username;
    //   createtime          
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")
    private Date createtime;
    private Date updatetime;
}

코드 를 수정 한 후에 우 리 는 프로젝트 실행 결 과 를 다음 과 같이 실행 합 니 다.

이 같은 결 과 를 통 해 알 수 있 듯 이 주 해 를 사용 하 는 방식 도 시간의 포맷 을 실현 할 수 있다.그것 의 실현 원 리 는 네 번 째 시간 포맷 의 실현 원리 와 유사 하 며,모두 데 이 터 를 되 돌려 주기 전에 해당 필드 를 시간 포맷 처리 하 는 것 이다.
총결산
본 고 는 5 가지 시간 포맷 의 실현 방법 을 소개 했다.그 중에서 첫 번 째 는 전단 시간 포맷 방법 이 고,그 다음 4 가 지 는 백 엔 드 포맷 방법 이다.Simple DateFormat 과 DateTimeFormatter 포맷 방법 은 일반적인 자바 프로젝트 에 더욱 적용 된다.그 중에서 Simple DateFormat 은 비 스 레 드 가 안전 하고,DateTimeFormatter 는 스 레 드 가 안전 하 다.그러나 스프링 부 트 프로젝트 에서 가장 좋 은 시간 포맷 방안 은 아니다.
Spring Boot 프로젝트 라면 네 번 째 전역 시간 포맷 이나 다섯 번 째 부분 시간 포맷 방식 을 추천 합 니 다.이 두 가지 실현 방식 은 핵심 업무 코드 를 수정 하지 않 고 간단하게 설정 하면 시간의 포맷 기능 을 완성 할 수 있 습 니 다.
SpringBoot 의 시간 포맷 에 관 한 다섯 가지 방법 에 관 한 글 은 여기까지 입 니 다.더 많은 SpringBoot 시간 포맷 에 관 한 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
참고&감사
https://www.jb51.net/article/218191.htm
baike.baidu.com/item/세계 시/692237

좋은 웹페이지 즐겨찾기