我在这里在 CF 中解决了一个难题。
您有一个时间戳作为参数传递给服务器。例如2012-5-10 14:55
. 您如何查看从给定的时间是否已经过去了 30 秒并返回true
or false
?
规则:
您不能使用当前服务器时间来检查是否已经过了 30 秒,因为时间戳来自世界上的任何地方并且总是错误的。
在这种情况下,您始终可以信任传递给服务器的参数时间戳。
在 ColdFusion 9 中这怎么可能(如果有的话)?
我在这里在 CF 中解决了一个难题。
您有一个时间戳作为参数传递给服务器。例如2012-5-10 14:55
. 您如何查看从给定的时间是否已经过去了 30 秒并返回true
or false
?
规则:
您不能使用当前服务器时间来检查是否已经过了 30 秒,因为时间戳来自世界上的任何地方并且总是错误的。
在这种情况下,您始终可以信任传递给服务器的参数时间戳。
在 ColdFusion 9 中这怎么可能(如果有的话)?
嗯....你的问题是你不知道延迟。您可以从收到时间戳开始计算 30 秒- 但这可能是创建时间戳之后的几秒钟。
你可以很容易地数 30 秒...
sleep(30000); //1000 miliseconds = 1 second. 30k = 30 seconds
因此,一旦您获得 var,您就可以“等待”三十秒,然后执行某些操作。但是从您的问题来看,您似乎需要从创建时间戳(在客户端上创建)开始精确 30 秒。你可能不能那么准确,因为:
如果您可以指定一个 HTML5 浏览器,您可以为此使用 websockets - 它实际上是在乞求它:) 但这是我能想到的唯一真正的解决方案。
您不指定传递给服务器的参数是API请求,表单提交还是ajax请求等,因此另一端的实现会有所不同。但是ColdFusion服务器端应该是极其相似的,基本上绑定了3个问题;时区、时间差异和延迟。
要解决时区问题,您可以要求将参数作为 UTC 时间传递。在将时间与 Coldfusion 进行比较时,您会执行以下操作:
<cfif DateDiff("s", Variables.PassedTimestamp, DateConvert( "Local2UTC", Now() )) EQ 30>
<!--- Exactly 30 seconds difference between timestamps --->
</cfif>
但是您不知道发送给您的时间是否与您服务器上的时间同步。为了帮助解决这个问题,您可以为另一端提供一种方法来查询您的时间并相应地调整他们的时间,或者用他们自己的时间回显您的时间。
该时间同步和最初讨论的时间戳发送都将受到延迟的影响。网络上的任何通信都会受到延迟的影响,只是延迟程度不同。位置和 Internet 连接类型比协议类型的影响更大。您可以执行类似 ping 另一端的操作以获取响应时间,然后将其减半并将其添加到时间戳中,但这仍然是一个近似值,并非所有服务器都会响应 ping。
此外,您的服务器和另一端的代码也会引入延迟。为了减少这种情况,您希望另一端尽可能接近请求结束时计算时间戳,并让您的代码尽快计算时间戳。这可以通过 ColdFusion 完成,方法是将请求时间设置为尽可能靠近 Application.cfm|cfc 的顶部。
<cfset Request.Now = Now()>
然后将检查代码更改为:
DateDiff("s", Variables.PassedTimestamp, DateConvert( "Local2UTC", Request.Now ))
相反,如果您想要循环直到 30 秒过去然后响应,请注意您的响应似乎不会在 30 秒后发生,因为延迟会延迟响应返回到另一端。
精确到 30 秒是不可能的,但你会采取一些措施让你更接近。如果您只需要查看是否已经过了大约 30 秒,那么这就足够了。