javascript - 操作JS Date内部时间

标签 javascript date ntp

我正在尝试将我的客户端应用程序时间同步到我的服务器时间(这很重要,因为该应用程序是无服务器的并且可以离线工作)。在应用程序启动时,我计算时间差,然后重写 Date.now() 方法以将差异添加到原始 now 中。例如假设以下代码:

Date.__serverDifference = calculateServerDifference();
Date.__now = Date.now;
Date.now = () => Date.__now() + Date.__serverDifference;

而且效果很好。但问题在于其他日期功能。例如,如果我使用 new Date() 它将返回原始时间,并且不关心覆盖的 now 方法。
正如 MDN 文档所述:

JavaScript Date objects represent a single moment in time in a platform-independent format. Date objects contain a Number that represents milliseconds since 1 January 1970 UTC.

有没有办法重写 js Date 类以根据这个新计算返回所有当前时间?

最佳答案

最好的方法是创建辅助方法,其中包含内置函数未返回所需值的所有函数的偏移量。您的 Date.__now 是一个开始,但您还可以:

const offset = calculateServerDifference();
const newDateIncludingOffset = (...args) => {
  const date = new Date(...args);
  date.setMilliseconds(date.getMilliseconds() + offset);
  return date;
};

然后将 new Date(...args) 的所有实例替换为 newDateInclusionOffset(...args)。如果您已经有很多对新日期的引用 - 咬紧牙关并适本地更改它们。

虽然您可以更改原型(prototype)上的方法,但 not such a good idea - 使用您自己的函数和方法而不更改内置函数是更好的方法。

您还可以使用自己的方法将 window.Date 完全替换为新的内容,从而允许您更改 Date 构造函数以考虑所需的偏移量 - 但同样,这不是一个好主意并可能导致脆弱的代码和不兼容问题。

关于javascript - 操作JS Date内部时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71232871/

相关文章:

MySql 统计表中当前月份和当前年份之前的所有行

java - 使用 Java DateTimeFormatter 解析 PDF 日期

php - 碳 : Get start and end date of week when knowing week in year and year

linux - 为什么 chronyc makestep 不能立即同步时间?

javascript - 如何生成带有隐藏源 (html) div 的 html2canvas 图像

javascript - 自动刷新页面特定

javascript - 修复了 fullpage.js 部分内的 div

javascript - Jquery将tr添加到表中的最后一行

redhat - 具有间歇性 refclock 的 chrony

c++ - 使用 std::chrono 的 NTP 时间戳