You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重写Date对象以返回偏移时间并保持时间正常流动

重写Date对象实现可偏移的动态虚假时间

核心实现思路

  1. 保存原生Date对象的引用,避免重写后丢失原始功能
  2. 维护全局偏移量(单位:小时),用于计算虚假时间
  3. 重写window.Date,实例化时根据偏移量调整时间,同时保留所有原生静态/实例方法
  4. 提供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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:23:18