首頁 > Java > java教程 > 主體

SpringBoot LocalDateTime格式轉換的方法是什麼

PHPz
發布: 2023-05-15 23:34:10
轉載
1418 人瀏覽過

    簡介

    說明

    #        專案我們常有前後端時間轉換的場景,例如:創建時間、更新時間等。一般情況下,前後端使用時間戳記或年月日的格式進行傳遞。

            如果後端收到了前端的參數每次都手動轉換為想要的格式,後端每次將資料傳給前端時都手動處理為想要的格式實在是太麻煩了。

    方案簡介

    要分兩種情境進行設定(根據Content-Type的不同):

    1.application/x-www-form-urlencoded 和multipart/ form-data

    • 本處將此種情況記為:不使用@RequestBody

    2.application/json

    • #即:使用@RequestBody的介面

    • 本處將此種情況記為:使用@RequestBody

    備註

    有人說,可以這樣設定:

    spring:
      jackson:
        date-format: yyyy-MM-dd HH:mm:ss
        time-zone: GMT 8
        serialization:
          write-dates-as-timestamps: false

    此配置只適用於Date這種,不適用於LocalDateTime等。
    Date序列化/反序列化時都是用的這種格式:"2020-08-19T16:30:18.823 00:00"。

    不使用@RequestBody

    方案1:@ControllerAdvice @InitBinder

    配置類別

    package com.example.config;
     
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.InitBinder;
     
    import java.beans.PropertyEditorSupport;
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.time.format.DateTimeFormatter;
     
    @ControllerAdvice
    public class LocalDateTimeAdvice {
        @InitBinder
        protected void initBinder(WebDataBinder binder) {
            binder.registerCustomEditor(LocalDateTime.class, new PropertyEditorSupport() {
                @Override
                public void setAsText(String text) throws IllegalArgumentException {
                    setValue(LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                }
            });
     
            binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() {
                @Override
                public void setAsText(String text) throws IllegalArgumentException {
                    setValue(LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                }
            });
     
            binder.registerCustomEditor(LocalTime.class, new PropertyEditorSupport() {
                @Override
                public void setAsText(String text) throws IllegalArgumentException {
                    setValue(LocalTime.parse(text, DateTimeFormatter.ofPattern("HH:mm:ss")));
                }
            });
        }
    }
    登入後複製

    #Entity

    package com.example.business.entity;
     
    import lombok.AllArgsConstructor;
    import lombok.Data;
     
    import java.time.LocalDateTime;
     
    @Data
    @AllArgsConstructor
    public class User {
        private Long id;
     
        private String userName;
     
        private LocalDateTime createTime;
    }
    登入後複製
    登入後複製

    Controller

    package com.example.business.controller;
     
    import com.example.business.entity.User;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    @RestController
    @RequestMapping("user")
    public class UserController {
        @PostMapping("save")
        public User save(User user) {
            System.out.println("保存用户:" + user);
            return user;
        }
    }
    登入後複製
    登入後複製

    測試

    postman存取:http://localhost:8080/user/save? userName=Tony&createTime=2021-09-16 21:13:21

    postman結果:

    SpringBoot LocalDateTime格式轉換的方法是什麼

    ##後端結果:

    SpringBoot LocalDateTime格式轉換的方法是什麼

    #方案2:自訂參數轉換器(Converter)

    實作org.springframework.core.convert.converter.Converter,自訂參數轉換器。

    設定類別

    package com.example.config;
     
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.convert.converter.Converter;
     
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
     
    @Configuration
    public class LocalDateTimeConfig {
     
        @Bean
        public Converter<String, LocalDateTime> localDateTimeConverter() {
            return new LocalDateTimeConverter();
        }
     
        public static class LocalDateTimeConverter implements Converter<String, LocalDateTime> {
            @Override
            public LocalDateTime convert(String s) {
                return LocalDateTime.parse(s, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            }
        }
    }
    登入後複製

    Entity#

    package com.example.business.entity;
     
    import lombok.AllArgsConstructor;
    import lombok.Data;
     
    import java.time.LocalDateTime;
     
    @Data
    @AllArgsConstructor
    public class User {
        private Long id;
     
        private String userName;
     
        private LocalDateTime createTime;
    }
    登入後複製
    登入後複製

    Controller

    package com.example.business.controller;
     
    import com.example.business.entity.User;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    @RestController
    @RequestMapping("user")
    public class UserController {
        @PostMapping("save")
        public User save(User user) {
            System.out.println("保存用户:" + user);
            return user;
        }
    }
    登入後複製
    登入後複製

    SpringBoot LocalDateTime格式轉換的方法是什麼

    SpringBoot LocalDateTime格式轉換的方法是什麼#測試

    postman存取:http://localhost:8080/user/save?userName=Tony&createTime=2021-09-16 21:13:21

    postman結果:

    後端結果

    #使用@RequestBody

    方案1:設定ObjectMapper

    法1:只用配置類別

    本方法只配置ObjectMapper即可,Entity不需要加@JsonFormat。

    設定類別

    package com.knife.example.config;
     
    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.databind.MapperFeature;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.deser.std.DateDeserializers;
    import com.fasterxml.jackson.databind.ser.std.DateSerializer;
    import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
    import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
    import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
    import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
    import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
    import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
    import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
    import lombok.SneakyThrows;
    import org.springframework.boot.autoconfigure.jackson.JacksonProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
     
    import java.text.SimpleDateFormat;
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.time.format.DateTimeFormatter;
    import java.util.Date;
     
    @Configuration
    public class JacksonConfig {
     
        @Bean
        public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder,
    									 JacksonProperties jacksonProperties) {
            ObjectMapper objectMapper = builder.build();
     
    		// 把“忽略重复的模块注册”禁用,否则下面的注册不生效
    		objectMapper.disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
            objectMapper.registerModule(configTimeModule());
    		// 重新设置为生效,避免被其他地方覆盖
    		objectMapper.enable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
            return objectMapper;
        }
     
        private JavaTimeModule configTimeModule() {
    		JavaTimeModule javaTimeModule = new JavaTimeModule();
     
    		String localDateTimeFormat = "yyyy-MM-dd HH:mm:ss";
    		String localDateFormat = "yyyy-MM-dd";
    		String localTimeFormat = "HH:mm:ss";
    		String dateFormat = "yyyy-MM-dd HH:mm:ss";
     
    		// 序列化
    		javaTimeModule.addSerializer(
    				LocalDateTime.class,
    				new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(localDateTimeFormat)));
    		javaTimeModule.addSerializer(
    				LocalDate.class,
    				new LocalDateSerializer(DateTimeFormatter.ofPattern(localDateFormat)));
    		javaTimeModule.addSerializer(
    				LocalTime.class,
    				new LocalTimeSerializer(DateTimeFormatter.ofPattern(localTimeFormat)));
    		javaTimeModule.addSerializer(
    				Date.class,
    				new DateSerializer(false, new SimpleDateFormat(dateFormat)));
     
    		// 反序列化
    		javaTimeModule.addDeserializer(
    				LocalDateTime.class,
    				new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(localDateTimeFormat)));
    		javaTimeModule.addDeserializer(
    				LocalDate.class,
    				new LocalDateDeserializer(DateTimeFormatter.ofPattern(localDateFormat)));
    		javaTimeModule.addDeserializer(
    				LocalTime.class,
    				new LocalTimeDeserializer(DateTimeFormatter.ofPattern(localTimeFormat)));
    		javaTimeModule.addDeserializer(Date.class, new DateDeserializers.DateDeserializer(){
    			@SneakyThrows
    			@Override
    			public Date deserialize(JsonParser jsonParser, DeserializationContext dc){
    				String text = jsonParser.getText().trim();
    				SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    				return sdf.parse(text);
    			}
    		});
    		
    		return javaTimeModule;
    	}
     
    }
    登入後複製
    SpringBoot LocalDateTime格式轉換的方法是什麼

    Entity

    #
    package com.example.business.entity;
     
    import lombok.Data;
     
    import java.time.LocalDateTime;
     
    @Data
    public class User {
        private Long id;
     
        private String userName;
     
        private LocalDateTime createTime;
    }
    登入後複製

    Controller

    package com.example.business.controller;
     
    import com.example.business.entity.User;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    @RestController
    @RequestMapping("user")
    public class UserController {
        @PostMapping("save")
        public User save(@RequestBody User user) {
            System.out.println("保存用户:" + user);
            return user;
        }
    }
    登入後複製
    登入後複製

    #測試

    SpringBoot LocalDateTime格式轉換的方法是什麼後端結果

    # 儲存使用者:User(id=null, userName=Tony, createTime=2021- 09-16T21:13:21)

    法2:設定類別@JsonFormat

    本方法需要設定ObjectMapper,Entity也需要加@JsonFormat。

    ######配置類別######
     import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
    import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
    import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
    import org.springframework.boot.autoconfigure.jackson.JacksonProperties;
    import org.springframework.boot.jackson.JsonComponent;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
     
    @Configuration
    public class JacksonConfig {
     
        @Bean
        public ObjectMapper serializingObjectMapper(Jackson2ObjectMapperBuilder builder,
                                                    JacksonProperties jacksonProperties) {
            ObjectMapper objectMapper = builder.build();
     
    		// 把“忽略重复的模块注册”禁用,否则下面的注册不生效
    		objectMapper.disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
     
            // 自动扫描并注册相关模块
            objectMapper.findAndRegisterModules();
     
            // 手动注册相关模块
            // objectMapper.registerModule(new ParameterNamesModule());
            // objectMapper.registerModule(new Jdk8Module());
            // objectMapper.registerModule(new JavaTimeModule());
     
    		// 重新设置为生效,避免被其他地方覆盖
    		objectMapper.enable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
     
            return objectMapper;
        }
     
    }
    登入後複製
    ######Entity#######
    package com.example.business.entity;
     
    import com.fasterxml.jackson.annotation.JsonFormat;
    import lombok.Data;
     
    import java.time.LocalDateTime;
     
    @Data
    public class User {
        private Long id;
     
        private String userName;
     
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private LocalDateTime createTime;
    }
    登入後複製
    ######Controller######
    package com.example.business.controller;
     
    import com.example.business.entity.User;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    @RestController
    @RequestMapping("user")
    public class UserController {
        @PostMapping("save")
        public User save(@RequestBody User user) {
            System.out.println("保存用户:" + user);
            return user;
        }
    }
    登入後複製
    登入後複製
    ################################################### ##測試##################後端結果########## 儲存使用者:User(id=null, userName=Tony, createTime=2021- 09-16T21:13:21)#########方案2:Jackson2ObjectMapperBuilderCustomizer###
    import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
    import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
    import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
    import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
    import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
    import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
    import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
    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;
     
    @Configuration
    public class LocalDateTimeConfig {
     
        private final String localDateTimeFormat = "yyyy-MM-dd HH:mm:ss";
        private final String localDateFormat = "yyyy-MM-dd";
        private final String localTimeFormat = "HH:mm:ss";
     
        @Bean
        public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
            return builder -> {
     
                // 反序列化(接收数据)
                builder.deserializerByType(LocalDateTime.class, 
                        new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(localDateTimeFormat)));
                builder.deserializerByType(LocalDate.class,
                        new LocalDateDeserializer(DateTimeFormatter.ofPattern(localDateFormat)));
                builder.deserializerByType(LocalTime.class,
                        new LocalTimeDeserializer(DateTimeFormatter.ofPattern(localTimeFormat)));
     
                // 序列化(返回数据)
                builder.serializerByType(LocalDateTime.class,
                        new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(localDateTimeFormat)));
                builder.serializerByType(LocalDate.class,
                        new LocalDateSerializer(DateTimeFormatter.ofPattern(localDateFormat)));
                builder.serializerByType(LocalTime.class,
                        new LocalTimeSerializer(DateTimeFormatter.ofPattern(localTimeFormat)));
            };
        }
    }
    登入後複製

    以上是SpringBoot LocalDateTime格式轉換的方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:yisu.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板