Dayjs计算两个日期时间差为何默认多出8小时?
Dayjs计算日期差结果多出8小时的原因及解决办法
你遇到的问题是因为错误地将时间差的毫秒数当作Unix时间戳来解析导致的:
当你用dayjs(result)处理diff返回的毫秒数时,Dayjs会把这个数值当成「从1970-01-01 00:00:00 UTC开始流逝的毫秒数」,也就是标准Unix时间戳。而我们处于东八区(UTC+8),这个UTC时间对应本地时间的1970-01-01 08:00:00,所以格式化后小时数默认显示为8,和实际时间差完全无关。
要得到正确的时分秒格式时间差,有两种常用解决方式:
方式一:手动计算时分秒
直接基于毫秒差值计算对应的小时、分钟、秒,再补零格式化:
const date1 = dayjs(Date.now()) const date2 = dayjs(1674235010388) const diffMs = date1.diff(date2) // 拆分时分秒 const hours = Math.floor(diffMs / (1000 * 60 * 60)) const minutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60)) const seconds = Math.floor((diffMs % (1000 * 60)) / 1000) // 补零确保两位数格式 const formattedDiff = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}` console.log(formattedDiff)
方式二:使用Dayjs的Duration插件
Dayjs原生不支持时长处理,需要引入duration插件来专门处理时间差:
首先引入插件:
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/duration.js"></script>
然后编写代码:
// 启用插件 dayjs.extend(window.dayjs_plugin_duration) const date1 = dayjs(Date.now()) const date2 = dayjs(1674235010388) const diffMs = date1.diff(date2) // 创建时长对象 const duration = dayjs.duration(diffMs) // 提取并格式化时分秒 const formattedDiff = `${duration.hours().toString().padStart(2, '0')}:${duration.minutes().toString().padStart(2, '0')}:${duration.seconds().toString().padStart(2, '0')}` console.log(formattedDiff)
核心思路就是:时间差是一个「时长」,不是一个「具体的时间点」,不能用解析时间戳的方式来处理它。
内容的提问来源于stack exchange,提问作者user6684898
相关产品推荐
相关产品推荐

