MongoDB聚合将+05:30偏移纪元时间戳转为yyyy mm dd hh mm ss格式
MongoDB聚合实现纪元时间转+05:30时区指定格式日期
实现逻辑对齐说明
完全匹配现有前端moment.js的转换规则:
- 秒级纪元时间戳乘1000转为毫秒级时间戳
- 应用+05:30时区偏移
- 输出
YYYY-MM-DD hh:mm:ss A格式的时间字符串
可直接复用的聚合管道代码
MongoDB 4.0及以上版本原生支持日期格式化的时区参数,直接在$project阶段用$dateToString操作符实现即可:
// 替换your_collection为实际集合名 db.your_collection.aggregate([ // 此处可插入业务需要的$match、$unwind、$sort等其他聚合阶段 { $project: { // 其他需要返回的字段按业务需求添加即可 displayTime: { $dateToString: { // 秒级时间戳转MongoDB标准Date对象 date: { $toDate: { $multiply: ["$timeStamp", 1000] } }, // 指定+05:30时区偏移,和moment.utcOffset("+05:30")逻辑一致 timezone: "+05:30", // 格式符完全匹配输出要求 format: "%Y-%m-%d %I:%M:%S %p" } } } } ])
格式符对应关系(避免写错)
MongoDB日期格式符和moment.js的写法有区别,对应关系如下:
%Y:4位年份,对应moment的YYYY%m:2位补零月份,对应moment的MM%d:2位补零日期,对应moment的DD%I:12小时制2位补零小时,对应moment的hh%M:2位补零分钟,对应moment的mm%S:2位补零秒数,对应moment的ss%p:大写AM/PM标识,对应moment的A
效果验证
用给出的示例纪元时间1563557673测试,上述聚合代码输出结果为2019-07-20 02:24:33 PM,和前端moment转换结果完全一致。
低版本兼容方案
如果使用的MongoDB版本低于4.0,不支持$dateToString的timezone参数,可以手动计算+05:30对应的毫秒偏移量(5.5小时=19800000毫秒),直接加到时间戳上再格式化:
displayTime: { $dateToString: { date: { $toDate: { $add: [{ $multiply: ["$timeStamp", 1000] }, 19800000] } }, format: "%Y-%m-%d %I:%M:%S %p" } }
注意:手动加偏移的方式不会自动处理夏令时,如果业务涉及夏令时场景,优先升级到4.0及以上版本用原生timezone参数实现。
内容的提问来源于stack exchange,提问作者Ghanshyam Vekariya
相关产品推荐
相关产品推荐

