如何在不知道服务器时间的情况下使用DateDiff?

时间:2012-05-10 15:37:38

标签: coldfusion coldfusion-9

我在这里要解决一个难题。

您将时间戳作为参数传递给服务器。例如2012-5-10 14:55。 如何从给定时间开始30秒后返回truefalse

规则:

  1. 您无法使用当前服务器时间来检查是否已过30秒,因为时间戳来自世界上任何地方,并且始终是错误的。

  2. 在这种情况下,您始终可以信任传递给服务器的参数时间戳。

  3. 在ColdFusion 9中如何实现这一点(如果有的话)?

2 个答案:

答案 0 :(得分:3)

嗯......你的问题是你不知道延迟。您可以在收到时间戳之后计算30秒 - 但这可能是创建时间戳后的秒数。

你可以轻松地计算30秒......

sleep(30000); //1000 miliseconds = 1 second. 30k = 30 seconds

因此,只要你得到var,就可以“等待”30秒,然后再做一些事情。但是从您的问题来看,您似乎需要在创建时间戳(在客户端上创建)之后的30秒内完成。你可能不会那么精确,因为:

  1. 2个时钟不同步
  2. 您无法弄清楚请求的延迟。
  3. 即使你可以,因为你不控制客户端,你将无法保证结果,因为HTTP是无状态的而不是实时的。
  4. 如果你可以指定一个HTML5浏览器,你可以使用websockets - 它实际上是在乞求它:)但这是我能想到的唯一真正的解决方案。

答案 1 :(得分:1)

您没有指定传递给服务器的参数是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。

此外,服务器和另一端的代码也会引入延迟。要减少这种情况,您希望另一端尽可能地将时间戳计算为接近请求的末尾,并且您的代码将尽快计算时间戳。这可以通过将请求时间设置为尽可能接近Application.cfm | cfc的顶部来完成ColdFusion。

<cfset Request.Now = Now()>

然后将检查代码更改为:

DateDiff("s", Variables.PassedTimestamp, DateConvert( "Local2UTC", Request.Now ))

相反,如果您希望循环直到30秒后再响应,请注意您的响应似乎不会在30秒后发生,因为延迟会将响应延迟回到另一端。 / p>

准确到达30秒是不可能的,但是你采取的措施会让你更接近。如果您只是需要查看是否已经过了大约30秒,那就足够了。