如何重写Date对象以返回偏移时间并保持时间正常流动
重写Date对象实现可偏移的动态虚假时间
核心实现思路
- 保存原生
Date对象的引用,避免重写后丢失原始功能 - 维护全局偏移量(单位:小时),用于计算虚假时间
- 重写
window.Date,实例化时根据偏移量调整时间,同时保留所有原生静态/实例方法 - 提供
shiftDate工具对象,快速设置偏移或恢复原生时间
完整代码实现
// 保存原生Date的引用 const OriginalDate = window.Date; // 初始化偏移量(正数向后偏移,负数向前偏移,单位:小时) let timeOffsetHours = 0; // 控制偏移的工具对象 window.shiftDate = { // 设置偏移量(小时) move(hours) { timeOffsetHours = hours; }, // 恢复原生时间 reset() { timeOffsetHours = 0; } }; // 重写Date对象 window.Date = function(...args) { // 无参调用:返回偏移后的当前时间 if (args.length === 0) { const realTime = new OriginalDate(); return new OriginalDate(realTime.getTime() + timeOffsetHours * 3600 * 1000); } // 带参数调用(时间戳/日期字符串):默认用原生逻辑 // 若需对指定日期也应用偏移,取消下面注释并修改逻辑 // if (typeof args[0] === 'number' || typeof args[0] === 'string') { // const realDate = new OriginalDate(...args); // return new OriginalDate(realDate.getTime() + timeOffsetHours * 3600 * 1000); // } // 其他构造场景(如new Date(2023,3,14))直接调用原生构造 return new OriginalDate(...args); }; // 继承原生Date的所有静态方法(如Date.now()、Date.parse()) Object.assign(window.Date, OriginalDate); // 继承原生Date的所有实例方法(如getFullYear()、toLocaleString()) window.Date.prototype = OriginalDate.prototype;
用法示例
// 查看真实时间 console.log(new OriginalDate()); // 输出:Fri Apr 14 2023 10:50:00 GMT+0200 // 设置向后偏移13小时 shiftDate.move(13); // 查看偏移后的时间 console.log(new Date()); // 输出:Fri Apr 14 2023 23:50:00 GMT+0200 // 时间会正常流动,1秒后再次调用 setTimeout(() => console.log(new Date()), 1000); // 输出:Fri Apr 14 2023 23:50:01 GMT+0200 // 恢复原生时间 shiftDate.reset(); console.log(new Date()); // 回到真实时间
关键细节说明
- 时间自然流动:偏移基于真实时间动态计算,每次
new Date()都会生成当前真实时间+偏移量的结果,时间会正常流逝 - 完整保留原生功能:通过
Object.assign继承静态方法,复用原生原型链保留实例方法,不会影响原有时间相关逻辑 - 灵活偏移控制:
shiftDate.move()支持正负值,正数向后偏移,负数向前偏移(比如要模拟下午5点,可计算当前时间到17点的差值,转成小时后传入) - 可选的参数处理:默认仅对无参
new Date()应用偏移,避免干扰指定日期的计算;若需全局偏移所有日期,可取消代码中的注释块
注意事项
- 仅在测试环境使用,避免影响生产环境的时间逻辑
- 内网扩展可通过content script的
world: "MAIN"配置注入到目标页面上下文,或直接在控制台执行代码
内容的提问来源于stack exchange,提问作者syncmate
相关产品推荐
相关产品推荐

