我有一个函数,每分钟检查一次是否是上午 7:30,如果到了时间,它就会向我发送一条短信。
但是由于我上传到heroku并且我的时区不同,所以我必须调整前面的时间,如下所示:
setInterval(function() {
let date = new Date();
if(date.getHours() == 11 && date.getMinutes() == 30){
sendDaily()
}
}, 60000)
但是当我上传到 Heroku 时,我的手机上会随机收到警报。我还尝试使用 schedule
包来帮助解决此问题,但出现了相同的错误,该函数在应该运行时没有运行。我也尝试过更改 heroku 上的时区,但这没有帮助,因为当我输入我的城市/位置时,它仍然给出相同的默认时区时间。
最佳答案
Heroku 构建在 AWS 上,并在它认为合适的任何中心创建容器。这意味着您的应用程序可以在世界任何地方运行,如此 AWS infrastructure map 所示。 。话虽如此,在服务器上使用 new Date
会根据创建的服务器产生非常不同的结果,而您无法控制该结果。
如何解决这个问题?
您需要解耦new Date
对操作系统的依赖。
选项
您可以使用返回一天中标准时间的 API,这将为所有 AWS 容器创建单一事实来源,无论它们位于何处。这是一个Example
假设所有 AWS 操作系统时钟均同步,您可以手动设置时区。您可以使用moment来做到这一点和 moment timezone
使用并非在世界各地随机创建的专用服务器。与任何权衡一样,如果您试图扩展,这会产生自己的问题,但它是一种选择。
关于node.js - Heroku - 延时函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51624919/