springboot controller 返回object json 日期 Date 带T的处理

本文详细解析了如何在Spring Boot应用中使用`application.yml`配置文件调整Jackson的日期格式为'yyyy-MM-dd HH:mm:ss'并设置时区为GMT+8。重点在于理解如何影响JSON转换过程及其在@RestController注解下的应用。

解决方案

application.yml配置格式化和时区

# Spring配置
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

效果如下:

修改前

修改后

在这里插入图片描述

简单分析

应该是springboot 在返回object的时候。是通过@RestController注解,让其转换成json进行返回的。

而其中对于object转换json的功能。是jackson负责完成的。
所以,这里针对jackson的参数进行配置即可。

在 NestJS 应用中,接口返回日期字段显示为 `Invalid Date` 通常是由以下几种原因导致的: 1. **日期字段的值不是合法的 Date 对象或 ISO 8601 字符串**:当后端返回日期字段为非标准格式(如时间戳、错误格式的字符串等)时,前端(尤其是浏览器中的 `new Date()` 方法)可能无法正确解析,从而导致显示为 `Invalid Date`。 2. **序列化问题**:NestJS 默认使用 `class-transformer` 和 `class-transformer-validator` 对返回的数据进行序列化处理。如果实体中的日期字段没有正确转换为 `Date` 型,或者没有使用 `@Transform` 进行格式化,可能会导致 JSON 序列化时字段被错误处理。 3. **时区问题**:某些情况下,日期字段可能由于时区转换错误而无法正确解析,尤其是在后端使用了特定时区处理而前端未做对应调整时。 --- ### 解决方法 #### 1. 确保数据库中的日期字段正确映射为 `Date` 型 在实体中,应确保日期字段被正确映射为 `Date` 型,例如使用 TypeORM 的 `@Column('date')` 或 `@Column('timestamp')` 注解[^1]: ```typescript import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class ExampleEntity { @PrimaryGeneratedColumn() id: number; @Column('timestamp') createdAt: Date; } ``` #### 2. 使用 `@Transform` 对日期字段进行格式化输出 如果希望接口返回统一格式日期字符串(如 `YYYY-MM-DD HH:mm:ss`),可以使用 `class-transformer` 的 `@Transform` 装饰器进行格式处理: ```typescript import { Transform } from 'class-transformer'; import { format } from 'date-fns'; export class ExampleDto { @Transform(({ value }) => format(value, 'yyyy-MM-dd HH:mm:ss')) createdAt: Date; } ``` #### 3. 使用拦截器统一处理日期格式 通过自定义拦截器,可以全局处理所有响应数据中的日期字段,确保返回格式一致。例如: ```typescript import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { format } from 'date-fns'; @Injectable() export class DateFormattingInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { return next.handle().pipe( map(data => { this.formatDates(data); return data; }) ); } private formatDates(obj: any): void { if (obj === null || typeof obj !== 'object') return; for (const key in obj) { if (obj[key] instanceof Date && !isNaN(obj[key].getTime())) { obj[key] = format(obj[key], 'yyyy-MM-dd HH:mm:ss'); } else if (typeof obj[key] === 'object') { this.formatDates(obj[key]); } } } } ``` 然后在控制器或全局应用该拦截器: ```typescript @UseInterceptors(DateFormattingInterceptor) @Controller('examples') export class ExampleController {} ``` #### 4. 前端处理日期格式 如果后端返回的是时间戳或非标准格式的字符串,前端可以进行处理,例如使用 `moment.js` 或 `date-fns` 进行解析和格式化: ```javascript const date = moment(response.createdAt).format('YYYY-MM-DD HH:mm:ss'); ``` --- ### 小结 通过确保实体字段型正确、使用 `@Transform` 格式化输出、应用拦截器统一处理日期格式,以及必要时在前端进行解析,可以有效解决 NestJS 接口中日期字段返回 `Invalid Date` 的问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何浩翔

如果对你多帮助,请支持。感谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值