Moment.js返回日期错误(年龄计算多出一岁)问题求助
问题原因
你遇到的年龄计算偏差不是日期格式错误导致的,核心问题是时区偏移不匹配:
- 数据库中存储的
2001-06-06T00:00:00.000+00:00是UTC标准时间,moment()默认会把输入的日期转换为运行环境的本地时区计算,若你的运行时区为UTC+N(例如国内时区为UTC+8),就会出现日期错位。 - 比如你计算年龄的当天本地时间为
2022-06-05 23:00,对应的UTC时间已经到了2022-06-06 07:00,此时如果用默认本地时区计算,还没到6月6日的本地0点,年龄应为20岁,但时区错位会导致Moment提前判定满21年。 - 调用
.diff()得到异常随机值,也是因为你没有统一计算两端的时区,导致差值计算的基准不统一。
修复方案
方案1:统一使用UTC时间计算
所有计算环节都对齐UTC时区,避免时区转换偏差:
// 构造UTC模式的Moment对象后调用toNow Age: moment.utc(user.dateOfBirth).toNow(true)
如果使用.diff()计算,也要统一两端时区:
// 计算年份差值,当前时间也转为UTC,第三个参数设为false直接取整 const age = moment.utc().diff(moment.utc(user.dateOfBirth), 'years', false)
方案2:构造时明确指定解析格式
如果你确认录入的日期为YYYY-MM-DD格式的公历日期,不需要考虑时分秒和时区,可以在构造Moment对象时明确指定格式,忽略时区偏移:
Age: moment(user.dateOfBirth, 'YYYY-MM-DD').toNow(true)
内容的提问来源于stack exchange,提问作者Clarice Hatischvili
相关产品推荐
相关产品推荐

