使用moment.format()时如何保留对象类型且维持原有时区偏移
Moment.js 保留时区同时支持排序与格式化展示的解决方案
实现逻辑
原生JS的Date对象本质固定绑定运行环境的本地时区,无法自定义保留其他时区偏移,因此要同时满足「带原时区展示」和「日期排序」两个需求,需要把排序用的原始值和展示用的格式化值分开处理,不要强制转成单一的字符串或原生Date类型。
具体操作步骤
- 保留
parseZone返回的原始Moment对象作为排序依据
Moment对象本身支持直接比较大小,也可调用valueOf()方法获取全局统一的Unix时间戳(毫秒数)作为排序权重,时间戳不受时区影响,排序结果完全准确:
// 存储带原时区偏移的Moment对象,不要提前转格式 const time = moment.parseZone("2021-09-28T12:00:00-07:00"); // 排序时直接使用,或者取时间戳作为排序key const sortKey = time.valueOf();
- 仅在需要渲染展示时调用
format()方法生成字符串
不要提前把Moment对象转成字符串存储,只在表格单元格渲染、输出显示的场景下临时调用格式化方法,此时会保留parseZone绑定的原始时区偏移:
// 按需格式化,支持自定义输出格式,自动保留原时区 const showText = time.format("YYYY-MM-DD HH:mm Z"); // 输出示例:2021-09-28 12:00 -07:00
表格组件适配说明
如果使用ElementUI、Ant Design等前端组件库的表格,直接在列配置中分开设置即可:排序字段指定为Moment对象的valueOf()返回值,单元格渲染逻辑调用format()生成展示文本,无需修改原始数据结构。
内容的提问来源于stack exchange,提问作者Edgardo
相关产品推荐
相关产品推荐

