如何将数据库取出的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
相关产品推荐
相关产品推荐

