flatMap中moment格式化日期失效,输出当前日期如何解决?
问题分析与解决方案
核心原因
你在flatMap中得到当前日期,说明实际传入moment的team.date并非你console.log看到的有效字符串——大概率是以下情况之一:
team.date是一个无效的Date对象(比如初始化失败的Date实例,console.log时会被转成字符串显示,但实际moment解析时会返回当前时间)- 循环过程中部分
team项的date字段为undefined/null - 字符串格式存在隐性差异(比如虽console.log显示为
2022-07-01T00:00:00.000,但实际包含不可见字符或格式不标准)
验证步骤
先在flatMap循环内添加日志,确认team.date的真实类型与值:
const result = { data: query.flatMap( (team) => { // 新增日志确认真实数据 console.log('team.date类型:', typeof team.date, '值:', team.date); return team.players.map((player) => ({ id: player.id, player_name: player.player_name, nname: team.name, date: moment(team.date).format('YYYY-MM-DD'), description: team.description, })) } ) }
若日志显示team.date为undefined/null,或类型为object但实际是无效Date,那就是问题根源。
解决办法
方法1:指定moment解析格式(推荐)
明确告知moment要解析的字符串格式,避免自动解析出错:
const result = { data: query.flatMap( (team) => team.players.map((player) => ({ id: player.id, player_name: player.player_name, nname: team.name, // 指定解析格式匹配你的日期字符串 date: moment(team.date, 'YYYY-MM-DDTHH:mm:ss.SSS').format('YYYY-MM-DD'), description: team.description, })) ) }
方法2:直接字符串截取(更轻量)
如果确定team.date格式固定为YYYY-MM-DDTHH:mm:ss.SSS,可不用moment,直接截取字符串:
const result = { data: query.flatMap( (team) => team.players.map((player) => ({ id: player.id, player_name: player.player_name, nname: team.name, date: team.date.split('T')[0], description: team.description, })) ) }
方法3:校验日期有效性
若存在部分team.date无效的情况,添加默认值处理:
const result = { data: query.flatMap( (team) => team.players.map((player) => { let dateStr = '无效日期'; if (team.date) { const parsed = moment(team.date, 'YYYY-MM-DDTHH:mm:ss.SSS', true); if (parsed.isValid()) { dateStr = parsed.format('YYYY-MM-DD'); } } return { id: player.id, player_name: player.player_name, nname: team.name, date: dateStr, description: team.description, } }) ) }
内容的提问来源于stack exchange,提问作者positive developer
相关产品推荐
相关产品推荐

