如何在JavaScript Date中获取当日的起始时间与结束时间
问题根因
你遇到的7小时偏移是时区差导致的:你当前运行环境的时区为UTC+7,当你混用UTC时间方法和本地时间方法、或是直接拼接不带时区标识的日期字符串时,就会出现该偏移。此外原生JavaScript的Date对象不存在.toDate()方法,你应该是在使用Day.js/Moment.js这类日期库的.toDate()方法返回原生Date实例。
修复方案
方案1:使用本地时区设置时间(绝大多数场景适用)
直接操作本地时区的时分秒,不要额外调用.utc()这类转UTC时区的方法:
// 原生JS实现 // 获取本地时区当日00:00:00 const getStartOfDay = () => { const now = new Date() // 直接设置本地时区的时分秒毫秒为0 now.setHours(0, 0, 0, 0) return now } // 获取本地时区当日结束时间,如果你确实需要中午11:59:59,把23改为11即可 const getEndOfDay = () => { const now = new Date() now.setHours(23, 59, 59, 999) return now }
如果你使用的是日期库:
// Day.js 示例 import dayjs from 'dayjs' const startOfDay = dayjs().startOf('day').toDate() const endOfDay = dayjs().endOf('day').toDate() // Moment.js 示例 const startOfDay = moment().startOf('day').toDate() const endOfDay = moment().endOf('day').toDate()
方案2:固定使用UTC时区时间
如果你业务要求使用UTC时区的当日起止时间,统一使用UTC相关方法操作:
// 原生JS实现UTC当日0点 const getUTCStartOfDay = () => { const now = new Date() now.setUTCHours(0, 0, 0, 0) return now } // 原生JS实现UTC当日结束 const getUTCEndOfDay = () => { const now = new Date() now.setUTCHours(23, 59, 59, 999) return now }
验证方法
你可以调用new Date().getTimezoneOffset()查看当前时区和UTC的差值,单位为分钟,返回值为-420即代表当前时区为UTC+7,和你遇到的7小时偏移对应。
注意:不要直接拼接
YYYY-MM-DDT00:00:00这类字符串创建日期,不同浏览器对不带时区标识的字符串解析逻辑不同,极易出现时区偏移问题。
内容的提问来源于stack exchange,提问作者julz oh
相关产品推荐
相关产品推荐

