1. 程式人生 > 程式設計 >前後端關於LocalDateTime的轉換問題

前後端關於LocalDateTime的轉換問題

問題:

    1.想返回指定的格式,比如時間戳或者指定的字串格式。
    2.想接收指定的格式,比如時間戳或者字串(預設要帶T才行,可以設定成不帶T)。
    3.想全域性設定。
複製程式碼

原理:

    重新定義LocalDateTime的序列化方式和反序列化方式。
    序列化: 把物件轉化為位元組。 (指定返回格式)
    反序列化: 把位元組轉化為物件。(接收指定格式)
    
    LocalDateTime序列化與反序列化的核心類:
    com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer的deserialize方法
    com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer的serialize方法
    
    ObjectMapper 給 指定類 設定 序列化方式 
    
複製程式碼

檔案:

    檢視原始碼
複製程式碼

步驟:

    1.建立LocalDateTimeSerializer類(為了返回時間戳)
    2.重定義mapperObject的Bean.
複製程式碼

1 建立LocalDateTimeSerializer類(自定義序列化方式,返回時間戳):

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;

/**
 * 處理localdatetime 不返回時間戳的問題
 *
 * @author dripy
 * @date 2019/12/17 20:08
 */
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
    @Override
    public void serialize(LocalDateTime local
DateTime,JsonGenerator jsonGenerator,SerializerProvider serializerProvider) throws IOException,JsonProcessingException { jsonGenerator.writeNumber(localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli()); } } 複製程式碼

2 重定義mapperObject的Bean:


import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
 * @author dripy
 * @date 2019/12/17 20:08
 */
@Configuration
public class Config {
    /**
     * 設定localdatetime的序列化與反序列化的方式
     *
     * @return
*/ @Bean(name = "mapperObject") public ObjectMapper getObjectMapper() { ObjectMapper om = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); // "下面兩個根據實際情況選擇 看要返回什麼格式" // "返回時間戳 注意這裡的LocalDateTimeSerializer是上面自己實現的一個" // javaTimeModule.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer()); // "返回指定字串格式 這裡的LocalDateTimeSerializer是com.fasterxml.jackson.datatype.jsr310.ser下的" javaTimeModule.addSerializer(LocalDateTime.class,new com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // 這個反序列化。接受前端傳來的格式 javaTimeModule.addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // 這兩個得加上。不然他倆預設返回了List結構 javaTimeModule.addSerializer(LocalDate.class,new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); javaTimeModule.addSerializer(LocalTime.class,new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss"))); om.registerModule(javaTimeModule); return om; } } 複製程式碼

補充:

    核心類:
    com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer的deserialize方法
    com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer的serialize方法
    
    可嘗試在這兩個方法中打上斷點。檢視請求與返回的時候使用的是什麼格式的DateTimeFormatter

複製程式碼

    盡然知道了原理。就知道怎麼改變了。
    1.接收yyyy-MM-dd HH:mm:ss格式
    2.接收時間戳格式
    3.返回yyyy-MM-dd HH:mm:ss格式
    4.返回時間戳格式
複製程式碼