Springboot 时间格式化

方法一:属性上加注解

时间属性上添加注解:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

less 复制代码
@Data  
@Builder  
@NoArgsConstructor  
@AllArgsConstructor  
public class Employee implements Serializable {  
  

    private Long id;  

    private String username;  

    private String name;  


    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")  
    private LocalDateTime createTime;  

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")  
    private LocalDateTime updateTime;  

  
}

方法二: 方法参数中添加注解@DateTimeFormat

less 复制代码
/**  
* 营业额统计  
* @param begin  
* @param end  
* @return  
*/  
@GetMapping("/turnoverStatistics")  
@ApiOperation("营业额统计")  
public Result<TurnoverReportVO> turnoverStatistics(  
    @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,  
    @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){  
    log.info("营业额数据统计:{},{}",begin,end);  
    return Result.success(reportService.getTurnoverStatistics(begin,end));  
}

方法三:拓展spring mvc的消息转换器

重写父类方法extendMessageConverters

scala 复制代码
@Configuration  
@Slf4j  
public class WebMvcConfiguration extends WebMvcConfigurationSupport {  
  
    @Autowired  
    private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;  
    @Autowired  
    private JwtTokenUserInterceptor jwtTokenUserInterceptor;  

    /**  
    * 注册自定义拦截器  
    * @param registry  
    */  
    protected void addInterceptors(InterceptorRegistry registry) {  
        log.info("开始注册自定义拦截器...");  
        registry.addInterceptor(jwtTokenAdminInterceptor)  
        .addPathPatterns("/admin/**")  
        .excludePathPatterns("/admin/employee/login");  

        registry.addInterceptor(jwtTokenUserInterceptor)  
        .addPathPatterns("/user/**")  
        .excludePathPatterns("/user/user/login")  
        .excludePathPatterns("/user/shop/status");  
    }  


    /**  
    * 设置静态资源映射,主要是访问接口文档(html、js、css)  
    * @param registry  
    */  
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {  
    log.info("开始设置静态资源映射...");  
    registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");  
    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");  
    }  

    /**  
    * 扩展Spring MVC框架的消息转化器  
    * @param converters  
    */  
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {  
        log.info("扩展消息转换器...");  
        //创建一个消息转换器对象  
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();  
        //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据  
        converter.setObjectMapper(new JacksonObjectMapper());  
        //将自己的消息转化器加入容器中  
        converters.add(0,converter);  
    }  
}

创建对象转换器JacksonObjectMapper

arduino 复制代码
/**  
* 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象  
* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]  
* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]  
*/  
public class JacksonObjectMapper extends ObjectMapper {  
  
    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";  
    //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";  
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";  
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";  

    public JacksonObjectMapper() {  
    super();  
    //收到未知属性时不报异常  
    this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);  

    //反序列化时,属性不存在的兼容处理  
    this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);  

    SimpleModule simpleModule = new SimpleModule()  
    .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))  
    .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))  
    .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))  
    .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))  
    .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))  
    .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));  

    //注册功能模块 例如,可以添加自定义序列化器和反序列化器  
    this.registerModule(simpleModule);  
    }  
}

目录结构

相关推荐
阿良别做梦2 分钟前
LangGraph 学习之路:给文档摘要接上模型
后端·开源
Random Glow17 分钟前
一条 SQL 从输入到返回,中间经历了什么
数据库·后端·mysql·性能优化·innodb·1024程序员节
GISer_Jing2 小时前
营销活动低代码前后台方案
后端
IT_陈寒2 小时前
React项目实战经验分享:如何避免useEffect闭包陷阱导致的陈旧状态问题?
前端·人工智能·后端
Maynor9962 小时前
免费 Cloudflare 只有 10 个 D1?满了之后的「穷鬼打法」:表前缀复用同一个库
数据库·后端·云计算·cloudflare
沙蒿同学11 小时前
不引 Ghostscript:我用纯 Go 给 PDF 做了一场「压缩手术」
前端·后端·github
前进的李工13 小时前
飞书企业知识库设计+后端高频八股
数据库·redis·后端·mysql·性能优化·飞书·rag
金銀銅鐵14 小时前
[Java] 展示增删元素时 LinkedList 的内部变化
java·后端·ai编程
武子康15 小时前
Vercel Cache Reason:相同 MISS,怎样决定下一步查什么
人工智能·后端·agent
杨文说AI与数字化16 小时前
把模型依赖做成可替换的组件:三层适配 + 一套回归评估
后端