我的假设是时间总是向前运行,但显然有时情况并非如此。
我有以下示例:
var LOOP_MS = 100;
var prevCall = +new Date();
setTimeout(function loop() {
foobar();
setTimeout(loop, LOOP_MS);
}, LOOP_MS);
function foobar() {
var now = +new Date(),
diff = now - prevCall; // expected to be somewhere around LOOP_MS
// do stuff
console.log(diff);
prevCall = now;
}
现在,大部分时间它都按预期工作,diff 显示一个接近 100 的数字。当然,在现实生活中,我希望这个数字会上升,尤其是当用户的计算机正在执行一些繁重的操作时。
我没想到会看到一个负数,但它确实发生了。怎么可能?我错过了什么吗?我认为这可能是由不同的时区引起的,但事实并非如此。我也在不同的浏览器(Chrome、Firefox、Safari)中看到它,并且 diff 值非常不一致:从 -9 到 -100 000 不等。
它发生在大约 0.025% 的生产案例中,所以这不是一个大问题,但我想知道它到底怎么可能发生(即使在理论上)?
我想我通过在慢速 VM 中运行脚本并模拟高 CPU 负载设法在本地重现它几次,但我仍然不明白为什么该函数会显示负数(意思是, now 比 prevCall 旧。
最佳答案
大多数计算机配置为使用 NTP 服务器来设置系统时钟。
由于系统时钟是第一次正常设置,它将保持同步而不需要更新。
有时(很少)由于各种原因,系统时钟可能会不同步。
由于系统时钟与 NTP 服务器时间不匹配,它会更新并可能倒退。
NTP 服务(通常)被配置为避免时钟倒退:如果“差距”足够小,NTP 守护进程会尝试“减慢”系统时钟,直到它再次进入 sysnc。但正如刚才所说,这取决于配置和时间间隔的大小。
我认为上述所有原因在极少数情况下会导致您遇到的问题。
您可能会发现这很有趣:Is there a way to ensure ntp synced clock never moves backwards?
如果您使用的是 macOS,您可以尝试打开控制台并搜索 ntpd。
在我的机器(10.9.5 的 MBP)上,我看到几行像这样的...
Apr 2 01:11:40 mac-di-paolo.local ntpd[46]: ntpd: wake time set -1.848017 s
...记录系统时钟调整。
关于javascript - 当前时间早于之前保存的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43251570/
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
如何找到调用此方法的位置?defto_xml(options={})binding.pryoptions=options.to_hifoptions&&options.respond_to?(:to_h)serializable_hash(options).to_xml(options)end 最佳答案 键入caller。这将返回当前调用堆栈。文档:Kernel#caller.例子[0]%rspecspec10/16|===================================================62=====
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实