溫馨提示×

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

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

SpringBoot?LocalDateTime格式轉(zhuǎn)換的方法是什么

發(fā)布時(shí)間:2023-04-17 11:33:14 來(lái)源:億速云 閱讀:121 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了SpringBoot LocalDateTime格式轉(zhuǎn)換的方法是什么的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇SpringBoot LocalDateTime格式轉(zhuǎn)換的方法是什么文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

    簡(jiǎn)介

    說(shuō)明

            項(xiàng)目我們經(jīng)常會(huì)有前后端時(shí)間轉(zhuǎn)換的場(chǎng)景,比如:創(chuàng)建時(shí)間、更新時(shí)間等。一般情況下,前后端使用時(shí)間戳或者年月日的格式進(jìn)行傳遞。

            如果后端收到了前端的參數(shù)每次都手動(dòng)轉(zhuǎn)化為想要的格式,后端每次將數(shù)據(jù)傳給前端時(shí)都手動(dòng)處理為想要的格式實(shí)在是太麻煩了。

    方案簡(jiǎn)介

    要分兩種情景進(jìn)行配置(根據(jù)Content-Type的不同):

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

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

    2.application/json

    • 即:使用@RequestBody的接口

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

    備注

    有人說(shuō),可以這樣配置:

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

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

    不使用@RequestBody

    方案1:@ControllerAdvice+@InitBinder

    配置類(lèi)

    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("保存用戶(hù):" + user);
            return user;
        }
    }

    測(cè)試

    postman訪問(wèn):http://localhost:8080/user/save?userName=Tony&createTime=2021-09-16 21:13:21

    postman結(jié)果:

    SpringBoot?LocalDateTime格式轉(zhuǎn)換的方法是什么

    后端結(jié)果:

    SpringBoot?LocalDateTime格式轉(zhuǎn)換的方法是什么

    方案2:自定義參數(shù)轉(zhuǎn)換器(Converter)

    實(shí)現(xiàn) org.springframework.core.convert.converter.Converter,自定義參數(shù)轉(zhuǎn)換器。

    配置類(lèi)

    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("保存用戶(hù):" + user);
            return user;
        }
    }

    測(cè)試

    postman訪問(wèn):http://localhost:8080/user/save?userName=Tony&createTime=2021-09-16 21:13:21

    postman結(jié)果:

    SpringBoot?LocalDateTime格式轉(zhuǎn)換的方法是什么

    后端結(jié)果

    SpringBoot?LocalDateTime格式轉(zhuǎn)換的方法是什么

    使用@RequestBody

    方案1:配置ObjectMapper

    法1:只用配置類(lèi)

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

    配置類(lèi)

    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();
     
    		// 把“忽略重復(fù)的模塊注冊(cè)”禁用,否則下面的注冊(cè)不生效
    		objectMapper.disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
            objectMapper.registerModule(configTimeModule());
    		// 重新設(shè)置為生效,避免被其他地方覆蓋
    		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;
    	}
     
    }

    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("保存用戶(hù):" + user);
            return user;
        }
    }

    測(cè)試

    SpringBoot?LocalDateTime格式轉(zhuǎn)換的方法是什么

    后端結(jié)果

    保存用戶(hù):User(id=null, userName=Tony, createTime=2021-09-16T21:13:21)

    法2:配置類(lèi)+@JsonFormat

    本方法需要配置ObjectMapper,Entity也需要加@JsonFormat。

    配置類(lèi)

     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();
     
    		// 把“忽略重復(fù)的模塊注冊(cè)”禁用,否則下面的注冊(cè)不生效
    		objectMapper.disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
     
            // 自動(dòng)掃描并注冊(cè)相關(guān)模塊
            objectMapper.findAndRegisterModules();
     
            // 手動(dòng)注冊(cè)相關(guān)模塊
            // objectMapper.registerModule(new ParameterNamesModule());
            // objectMapper.registerModule(new Jdk8Module());
            // objectMapper.registerModule(new JavaTimeModule());
     
    		// 重新設(shè)置為生效,避免被其他地方覆蓋
    		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("保存用戶(hù):" + user);
            return user;
        }
    }

    測(cè)試

    SpringBoot?LocalDateTime格式轉(zhuǎn)換的方法是什么

    后端結(jié)果

    保存用戶(hù):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 -> {
     
                // 反序列化(接收數(shù)據(jù))
                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)));
     
                // 序列化(返回?cái)?shù)據(jù))
                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)));
            };
        }
    }

    關(guān)于“SpringBoot LocalDateTime格式轉(zhuǎn)換的方法是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“SpringBoot LocalDateTime格式轉(zhuǎn)換的方法是什么”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

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

    AI