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

如何将数据库取出的ISO日期对象数组转为月份+年份格式字符串数组

实现方案

可以直接用原生JS完成转换,不需要引入第三方依赖,具体实现如下:

先修正示例的语法问题

你贴的示例数组有语法疏漏:readDetail 对应的日期值没有加引号,会被JS当成非法的算术表达式解析。不管是标准的带T分隔的ISO格式(2021-04-17T14:23:26.978Z),还是你写的空格分隔的变体格式(2021-04-17 14:23:26.978Z),现代JS环境都能正常解析,修正后的合法原始数据结构应该是这样的:

const apple = [
  { "readDetail": "2021-04-17 14:23:26.978Z" },
  { "readDetail": "2021-02-18 14:23:26.978Z" },
  { "readDetail": "2019-04-18 14:23:26.978Z" }
]

两种转换实现思路

思路1:自定义月份映射(完全可控)

自己维护月份名的列表,通过原生Date对象解析时间,拼接出符合要求的字符串。这种方法没有运行时差异,可自由调整月份的显示格式(长名/缩写):

// 根据需求自定义月份显示文案
const FULL_MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
const SHORT_MONTH_NAMES = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

const result = apple.map(item => {
  const date = new Date(item.readDetail);
  // 用UTC方法取时间值,避免本地时区计算偏差
  const monthIndex = date.getUTCMonth(); // 返回值为0-11,和数组下标完全匹配
  const year = date.getUTCFullYear();
  // 要展示长月份名就用FULL_MONTH_NAMES,要缩写就换SHORT_MONTH_NAMES
  return `${FULL_MONTH_NAMES[monthIndex]} ${year}`;
})
// 实际输出结果:["April 2021", "February 2021", "April 2019"]

思路2:用内置Intl API(无需维护映射表)

如果不需要手动自定义月份文案,可以直接用JS全局自带的国际化接口格式化,自动匹配对应语言的月份名称:

const result = apple.map(item => {
  const date = new Date(item.readDetail);
  return new Intl.DateTimeFormat('en-US', {
    month: 'long', // 改成'short'即可输出缩写月份(比如'Feb')
    year: 'numeric',
    timeZone: 'UTC' // 强制对齐原ISO时间的UTC时区,避免跨时区算错日期
  }).format(date);
})

容易踩的坑

  • 别直接用getMonth()/getFullYear()这类不带UTC的方法:这类方法会按照当前运行环境的本地时区解析时间,比如原ISO时间是UTC的零点,在东八区会被识别为当天8点,碰到月底/年初的时间点,很容易算错月份、年份
  • 你给出的目标输出示例["April 2021","April 2020", "Feb 2021"]和你提供的输入时间值并不对应,仅为格式参考,实际输出会严格匹配输入的日期值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 09:15:03