如何将MongoDB中Date.now返回的ISO字符串转换为yyyy-MM-dd hh:mm:ss格式UTC字符串
解决方案
方案1:原生JavaScript实现(无第三方依赖)
直接对Date对象调用UTC相关方法拼接即可,不需要引入额外依赖:
function formatUTCDate(isoDateStr) { const date = new Date(isoDateStr); // 小于10的数字自动补前导零 const pad = (num) => num.toString().padStart(2, '0'); const year = date.getUTCFullYear(); const month = pad(date.getUTCMonth() + 1); const day = pad(date.getUTCDate()); const hours = pad(date.getUTCHours()); const minutes = pad(date.getUTCMinutes()); const seconds = pad(date.getUTCSeconds()); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } // 测试用例 console.log(formatUTCDate('2021-08-30T03:30:54.446Z')); // 输出结果:2021-08-30 03:30:54
注意必须使用带UTC后缀的日期方法,不要使用普通的getFullYear、getMonth这类方法,后者会读取本地时区的时间,不符合你要求UTC时间的需求。
方案2:使用第三方日期库简化代码
如果项目中已经引入了日期处理库,可以直接调用内置格式化能力,指定UTC时区即可:
dayjs 实现(需要先引入utc插件)
import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; dayjs.extend(utc); const formattedDate = dayjs('2021-08-30T03:30:54.446Z').utc().format('YYYY-MM-DD HH:mm:ss');
moment.js 实现
const formattedDate = moment.utc('2021-08-30T03:30:54.446Z').format('YYYY-MM-DD HH:mm:ss');
方案3:Mongoose查询时自动格式化
如果你是从MongoDB查询数据,可通过Mongoose虚拟属性配置,查询返回文档时自动生成格式化后的日期,不需要每次手动转换:
// 在CommentModel定义处添加虚拟属性 CommentModel.virtual('formattedDate').get(function() { const date = this.date; const pad = num => num.toString().padStart(2, '0'); return `${date.getUTCFullYear()}-${pad(date.getUTCMonth()+1)}-${pad(date.getUTCDate())} ${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}:${pad(date.getUTCSeconds())}`; }); // 查询时开启虚拟字段返回即可 CommentModel.find().lean({ virtuals: true });
内容的提问来源于stack exchange,提问作者Shina
相关产品推荐
相关产品推荐

