【问题标题】:JavaScript function to run everyday at 6:30pm ESTJavaScript 函数每天在美国东部标准时间下午 6:30 运行
【发布时间】:2021-06-21 12:11:56
【问题描述】:

我编写了一个 JavaScript 函数,我只需将其复制粘贴到浏览器控制台中并运行,一切都很好,并且完全按照我的意愿工作。

看起来像:

function test(d) {
  // ....
}
    
test(num);

我希望用类似“while”的语句来包装这个函数。请记住,我还不是最擅长 JavaScript 的人。

基本上,我正在寻找的是不是美国东部标准时间下午 6:30...继续等待并再次检查。当它到达 6:30 PM EST 时,执行脚本。

谁能帮我看看语法是什么样的?我在 Stack Overflow 上找到了很多,但语法对我来说并没有什么意义。

任何帮助将不胜感激。

【问题讨论】:

  • 这预计在什么运行时执行?您是否有专门的机器来运行脚本(或其主机页面)?在任何情况下,有关 Stack Overflow 的问题都应该是与计算机软件开发相关的特定、可回答的技术问题。虽然您的问题符合该测试的最后一个环节,但该问题绝不符合该测试的任何其他组成部分。社区不会为你编写你的代码——你应该编辑你的问题以包括你以前的尝试,甚至是你在解决问题时所做的研究。
  • 这样的while 循环会阻塞浏览器。看看developer.mozilla.org/en-US/docs/Web/API/…
  • @zhulien,更正这预计将在我的浏览器选项卡上运行,我将保持打开状态.. 我确实找到了一些 setTimeout 解决方案,例如 [1],但老实说,我不喜欢使用这个解决方案,因为我不明白它在做什么.. 我正在寻找更多的解释,如何使用这个 setTimeout 计算得到一个值,直到下午 6:30 或任何时候才运行 [1] stackoverflow.com/questions/4455282/…跨度>
  • 它总是必须在浏览器中执行还是只需要定期运行一些JS?关于前者,您是否检查过:stackoverflow.com/questions/24741530/…?对于后者,您可能会查看cron,更具体地说 - node-cron。每隔一秒左右进行一次循环检查是一个非常懒惰的解决方案,更不用说性能不佳了,它需要您在单独的 Web Worker 中运行它。 [已编辑]。
  • 最简单的方法是使用 setTimeout 计算从现在到所需日期/时间之间的时间偏移,这需要脚本可以运行(保持标签打开)。

标签: javascript timer


【解决方案1】:

好的,请注意几点。如果您不需要在浏览器本身中运行脚本,而只是在特定的时间间隔运行一些 JavaScript,您应该检查一些调度程序,例如 cron,更具体地说是 JavaScript - node-cron

在一个循环中每秒左右检查“是时候了,是时候了,......”的解决方案是一种非常糟糕的方法。

  1. 非常浪费且性能不佳。
  2. 它会阻止您的脚本执行,因此您必须像 Web Worker 一样在单独的进程中执行它。

不使用任何依赖项的最简单方法是使用setTimeoutsetInterval 的组合手动安排您的工作。这是一个非常基本未完善的解决方案,应该可以帮助您。

const msInSecond = 1000;
const msInMinute = 60 * msInSecond;
const msInHour = 60 * msInMinute;
const msInDay = 24 * msInHour;

const desiredTimeInHoursInUTC = 18; // fill out your desired hour in UTC!
const desiredTimeInMinutesInUTC = 30; // fill out your desired minutes in UTC!
const desiredTimeInSecondsInUTC = 0; // fill out your desired seconds in UTC!

const currentDate = new Date();

const controlDate = new Date(currentDate.getUTCFullYear(), currentDate.getUTCMonth(), currentDate.getUTCDate(), desiredTimeInHoursInUTC, desiredTimeInMinutesInUTC, desiredTimeInSecondsInUTC);
let desiredDate;

if (currentDate.getTime() <= controlDate.getTime()) {
    desiredDate = controlDate;
}
else {
    desiredDate = new Date(controlDate.getTime() + msInDay);
}

const msDelta = desiredDate.getTime() - currentDate.getTime();

setTimeout(setupInterval, msDelta);

function setupInterval() {
    actualJob();

    setInterval(actualJob, msInDay);
}

function actualJob() {
    console.log('test');
}

简而言之,它计算当前时间与下一个可能即将执行的时间段之间的差异。然后,我们使用这个时间差来执行所需的任务,并在之后每 24 小时安排一次执行。

您需要为desiredTimeInHoursInUTCdesiredTimeInMinutesInUTCdesiredTimeInSecondsInUTC 提供值。所有这些都应该在 UTC (EST 和 UTC 之间的正常差异是 -4 或换句话说 - (hour EST - hour UTC = -4)。您可以(并且实际上应该)改进此解决方案以处理时区并且时差计算通常更优雅。

这里需要注意的是,它不会为您处理夏令时,因此您应该牢记这一点。您可以使用像 moment.js 这样的专用库轻松解决这个问题。此外,代码很简单,在这个版本中不支持跳过特定日期等情况。不过,您始终可以扩展它来处理这些问题。

最后,每次您重新启动脚本时,它都会正确安排您的函数执行时间,因此您无需一直打开选项卡。另外一个好处是,该解决方案的性能非常好,因为它不会在执行时间到来时连续进行检查,而是提前安排所有内容,之后不再进行任何检查。

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 2012-07-12
    • 2021-04-15
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    相关资源
    最近更新 更多