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

Angular接收REST API日期格式变时间戳,如何保留原格式?

保留REST API返回的原始日期格式解决方案

这个问题我之前开发Angular项目时也踩过坑!本质原因是Angular的HttpClient默认会自动识别JSON里的日期格式字符串,把它转换成Date对象,而当你直接访问这个对象的值时,它就会返回对应的时间戳数值(也就是你看到的大数字1526555305203)。要保留后端返回的原始日期字符串格式,这里有几个可行的方案:

方案一:前后端约定字段类型(最推荐)

直接在Angular的接口定义里,把日期对应的字段类型声明为string,而不是Date,同时确保后端返回的日期确实是字符串格式(你的后端已经做到了):

// 先定义对应的数据接口
interface TableData {
  // 其他业务字段...
  createTime: string; // 这里用string类型接收日期
}

// 调用接口时指定类型
this.configurationService.retrieveTableData(this.schemaFullname, this.tableName)
  .subscribe((data: TableData) => {
    // 此时data.createTime就是后端返回的原始字符串"2018-05-17 19:08:25.203"
    console.log(data.createTime);
  });

方案二:自定义JSON解析逻辑,跳过日期自动转换

如果不想修改接口类型,可以让HttpClient返回原始文本,然后手动解析JSON,在解析过程中保留日期字符串:

首先修改服务里的接口调用方法,指定responseType: 'text':

// 在configurationService中的方法
retrieveTableData(schemaFullname: string, tableName: string): Observable<string> {
  return this.http.get(`${你的API地址}/table-data`, {
    params: { schemaFullname, tableName },
    responseType: 'text' // 让HttpClient返回原始文本,不自动解析JSON
  });
}

然后在订阅时手动解析,自定义处理日期字段:

this.configurationService.retrieveTableData(this.schemaFullname, this.tableName)
  .subscribe(rawText => {
    const data = JSON.parse(rawText, (key, value) => {
      // 判断值是否符合你的日期格式,是的话直接返回原始字符串
      if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}$/.test(value)) {
        return value;
      }
      // 其他字段正常解析
      return value;
    });
    // 现在data里的日期就是原始格式了
  });

方案三:把Date对象转回目标格式(事后补救)

如果已经拿到了时间戳或者Date对象,也可以手动格式化成你需要的字符串:

this.configurationService.retrieveTableData(this.schemaFullname, this.tableName)
  .subscribe(data => {
    // 假设data里的日期字段是Date对象或者时间戳
    const dateObj = new Date(data.yourDateField);
    // 格式化为"YYYY-MM-DD HH:mm:ss.SSS"
    const formattedDate = `${dateObj.getFullYear()}-${String(dateObj.getMonth()+1).padStart(2, '0')}-${String(dateObj.getDate()).padStart(2, '0')} ${String(dateObj.getHours()).padStart(2, '0')}:${String(dateObj.getMinutes()).padStart(2, '0')}:${String(dateObj.getSeconds()).padStart(2, '0')}.${String(dateObj.getMilliseconds()).padStart(3, '0')}`;
    console.log(formattedDate); // 输出"2018-05-17 19:08:25.203"
  });

个人最推荐方案一,前后端明确约定字段类型,既能避免解析歧义,也让代码更清晰易懂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:21:58