溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Springboot怎樣進行全局日期格式化

發(fā)布時間:2021-09-29 16:06:25 來源:億速云 閱讀:149 作者:柒染 欄目:編程語言

這篇文章給大家介紹Springboot怎樣進行全局日期格式化,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

最近部門幾位同事受了一些委屈相繼離職,共事三年臨別之際頗有不舍,待一切手續(xù)辦妥帖,寒暄過后送他們出公司,幾個老哥臨別時沖我鬼魅一笑,我頓時心里一緊有種不好的預(yù)感,這事絕對沒有這么簡單。等我接手這幾個大佬的項目后,應(yīng)驗了我的預(yù)感,此刻我居然有點后悔,為啥送別之時沒揍他們一頓!哈哈哈~ 而這種打人的沖動,在我開始優(yōu)化幾位老哥的項目時候,變得越來越強烈。

有個坑

技術(shù)部每個月都會組織一下代碼走查及優(yōu)化,以前是各自審查優(yōu)化自己的項目,如今幾位老哥的離職他們的項目就落到了我的頭上。對于程序員來說最痛苦的事情就是接手別人的項目,還要做優(yōu)化改造,因為這一點也不比重構(gòu)一遍項目簡單。不過,軍令在前,沒辦法硬著頭皮上吧!

第一個優(yōu)化的點就讓我有點崩潰,這幾個大佬的技能能力很強,一直都是我學(xué)習(xí)的榜樣,但在項目里幾乎所有的日期格式化都這樣用 SimpleDateFormat ,像如下代碼這樣實現(xiàn),emm~ ,受過傷的男人怎么啥事都做的出來,哈哈哈~

SvcOrderDailyStatisticsPo orderDailyStatisticsPo = new SvcOrderDailyStatisticsPo();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date stationTime = dateFormat.parse(dateFormat.format(svcWorkOrderPo.getPayEndTime()));
orderDailyStatisticsPo.setStatisticalDate(stationTime);

而且項目中的時間和日期API用的也比較混亂,考慮到 java.util.Datejava.util.Calendar 不支持時區(qū),且非線程安全,對于日期的計算相對繁瑣,技術(shù)部一致要求用JDK1.8以后的 java.time LocalDateTime。但不少人還是在用 java.util.Datejava.util.Calendar 處理日期。

優(yōu)化方案

時間格式化是使用頻率非常高的,如何讓時間格式化變得既簡單又不用重復(fù)造輪子,那么就應(yīng)將它抽象出來,作為全局的日期格式化處理,下面就結(jié)合實踐簡單介紹下幾種優(yōu)化方案。

測試地址:http://127.0.0.1:8080/timeTest

@GetMapping("/timeTest")
    public OrderInfo timeTest() {
        OrderInfo order = new OrderInfo();
        order.setCreateTime(LocalDateTime.now());
        order.setUpdateTime(new Date());
        return order;
    }
1、@JsonFormat注解

使用@JsonFormat注解格式化時間,應(yīng)該算是一個基本操作了,大部分開發(fā)者都應(yīng)用此種方式,簡單方便。

/**
 * @Author: xiaofu
 * @Description:
 */
public class OrderInfo {

    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    public LocalDateTime getCreateTime() {
        return createTime;
    }

    public void setCreateTime(LocalDateTime createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

測試一下結(jié)果,發(fā)現(xiàn) Date 類型和 LocalDateTime 類型都格式化成功,但還是有個問題,這樣做仍然比較繁瑣,每個實體類的日期字段都要加@JsonFormat注解,重復(fù)的工作量也不小。接著往下看~ Springboot怎樣進行全局日期格式化

2、全局配置 (1)

Springboot 已經(jīng)為我們提供了日期格式化 ${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss},這里我們需要進行全局配置,配置比較簡單,也無需在實體類屬性上添加@JsonFormat注解。

/**
 * @Author: xiaofu
 * @Description:
 */
public class OrderInfo {

    //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    public LocalDateTime getCreateTime() {
        return createTime;
    }

    public void setCreateTime(LocalDateTime createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

只需要用@Configuration定義一個配置類,注入兩個Bean即可完成全局日期格式化處理,這種方式也是當前我項目中正在用的方式。

/**
 * @Author: xiaofu
 * @Description:
 */
@Configuration
public class LocalDateTimeSerializerConfig {

    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;

    @Bean
    public LocalDateTimeSerializer localDateTimeDeserializer() {
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
    }

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
    }
}

這種方式可支持 Date 類型和 LocalDateTime 類型并存,那么有一個問題就是現(xiàn)在全局時間格式是yyyy-MM-dd HH:mm:ss,但有的字段卻需要yyyy-MM-dd格式咋整?

那就需要配合@JsonFormat注解使用,在特定的字段屬性添加@JsonFormat注解即可,因為@JsonFormat注解優(yōu)先級比較高,會以@JsonFormat注解標注的時間格式為主。

3、全局配置 (2)

這種全局配置的實現(xiàn)方式與上邊的效果是一樣的,不過,要注意的是使用這種配置后,字段手動配置@JsonFormat注解將不再生效。

/**
 * @Author: xiaofu
 * @Description:
 */
public class OrderInfo {

    //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    public LocalDateTime getCreateTime() {
        return createTime;
    }

    public void setCreateTime(LocalDateTime createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}
/**
 * @Author: xiaofu
 * @Description:
 */
@Configuration
public class LocalDateTimeSerializerConfig {

    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;

    @Bean
    @Primary
    public ObjectMapper serializingObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
        objectMapper.registerModule(javaTimeModule);
        return objectMapper;
    }

    public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
        @Override
        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeString(value.format(ofPattern(pattern)));
        }
    }

    public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
        @Override
        public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException {
            return LocalDateTime.parse(p.getValueAsString(), ofPattern(pattern));
        }
    }
}

關(guān)于Springboot怎樣進行全局日期格式化就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI