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

如何自动将含字符串日期的JSON响应转换为JS日期(多字段多类)

无需手动遍历JSON响应,自动转换日期字符串为JS Date(基于date-fns)

当然可以不用每次请求都手动遍历JSON响应修改对象,结合date-fns库能轻松实现日期字符串到JS Date对象的自动转换,下面给你两种实用方案:

一、通用日期转换函数(适用于任意JSON结构)

可以封装一个通用函数,传入JSON响应和需要转换的日期字段列表,函数会递归处理对象/数组,自动把指定字段的字符串转成Date对象:

import { parseISO } from 'date-fns';

function convertDates(obj, dateFields) {
  // 非对象直接返回
  if (!obj || typeof obj !== 'object') return obj;

  // 数组则递归处理每个元素
  if (Array.isArray(obj)) {
    return obj.map(item => convertDates(item, dateFields));
  }

  // 复制原对象避免修改源数据
  const processedObj = { ...obj };

  // 转换指定日期字段
  dateFields.forEach(field => {
    if (processedObj[field]) {
      // 服务器返回ISO格式日期时用parseISO,其他格式用parse(见下方说明)
      processedObj[field] = parseISO(processedObj[field]);
    }
  });

  // 递归处理嵌套对象
  Object.keys(processedObj).forEach(key => {
    const value = processedObj[key];
    if (typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)) {
      processedObj[key] = convertDates(value, dateFields);
    }
  });

  return processedObj;
}

使用示例

// 假设请求返回的JSON数据
const apiResponse = await fetch('/api/orders').then(res => res.json());
// 指定需要转换的日期字段
const targetDateFields = ['createTime', 'payTime', 'deliveryTime'];
// 自动转换日期
const dataWithDates = convertDates(apiResponse, targetDateFields);

如果服务器返回的是非ISO格式的日期字符串(比如YYYY-MM-DD HH:mm:ss),可以替换成date-fns的parse方法:

import { parse } from 'date-fns';

// 在convertDates函数里替换对应行
processedObj[field] = parse(processedObj[field], 'yyyy-MM-dd HH:mm:ss', new Date());

二、结合类的静态方法(适用于结构化数据)

如果你的数据对应明确的类(比如用户、订单),可以在类里定义fromJSON静态方法,专门处理JSON到类实例的转换,同时自动转换日期字段:

import { parseISO } from 'date-fns';

class Order {
  constructor(id, orderNo, createTime, totalAmount) {
    this.id = id;
    this.orderNo = orderNo;
    this.createTime = createTime; // 已转换为Date对象
    this.totalAmount = totalAmount;
  }

  // 静态方法:从JSON生成类实例
  static fromJSON(json) {
    const createTime = parseISO(json.createTime);
    return new Order(json.id, json.orderNo, createTime, json.totalAmount);
  }
}

使用示例

const orderJson = await fetch('/api/orders/123').then(res => res.json());
const order = Order.fromJSON(orderJson);
// order.createTime 已经是Date对象

这两种方案都不用每次请求手动遍历对象,只需提前定义好转换规则,请求后调用对应方法即可完成日期转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:07:20