You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将JSON中接收的java.sql.Date格式日期转换为JavaScript Date类型

java.sql.Date序列化字符串转JavaScript Date对象解决方案

实际上你接口返回的JSON中startDate和endDate已经被Jackson序列化为YYYY-MM-DD格式的字符串,并非直接返回java.sql.Date对象,直接在前端做字符串转Date对象即可,也可根据需求调整后端序列化规则。

前端处理方案

第一步:修正并优化TypeScript Coupon类

首先修正原有类中comapnyId的拼写错误,将日期字段类型调整为Date,新增构造函数处理原始接口数据转换:

// 定义接口返回的原始数据结构类型
interface CouponRaw {
  id: number;
  company: {id: number; name: string};
  category: string;
  title: string;
  description: string;
  startDate: string;
  endDate: string;
  amount: number;
  price: number;
  image: string;
}

// 优化后的Coupon业务类
class Coupon {
  public id: number = 0; 
  public companyId:number = 0;
  public category:string = "";
  public title:string = "";
  public description: string = "";
  public startDate: Date;
  public endDate: Date;
  public amount:number = 0;
  public price:number = 0;
  public image:string = "";

  constructor(raw: CouponRaw) {
    this.id = raw.id;
    this.companyId = raw.company.id;
    this.category = raw.category;
    this.title = raw.title;
    this.description = raw.description;
    // 转换字符串为JS Date对象
    this.startDate = parseSafeDate(raw.startDate);
    this.endDate = parseSafeDate(raw.endDate);
    this.amount = raw.amount;
    this.price = raw.price;
    this.image = raw.image;
  }
}

/**
 * 安全转换YYYY-MM-DD格式字符串为Date对象,解决部分旧浏览器时区偏移问题
 */
function parseSafeDate(dateStr: string): Date {
  const [year, month, day] = dateStr.split('-').map(Number);
  // JS月份从0开始计数,因此需要减1
  return new Date(year, month - 1, day);
}

第二步:接口请求后转换数据

拿到接口返回的原始JSON数据后,直接通过构造函数实例化Coupon对象即可:

// 示例:fetch请求转换
fetch('/api/coupon/list')
  .then(res => res.json())
  .then((rawCouponList: CouponRaw[]) => {
    const couponList = rawCouponList.map(raw => new Coupon(raw));
    // couponList中的startDate、endDate均为可直接使用的JS Date对象
  })

后端可选优化方案

如果需要统一全局日期序列化规则,避免前端兼容问题,可以在Java实体类的日期字段上添加Jackson的@JsonFormat注解,指定序列化格式与时区:

@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") // 时区替换为业务实际使用的时区
private Date startDate; 

@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date endDate; 

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:54:05