首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不知道服务器时间的情况下使用DateDiff?

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

Stack Overflow用户
提问于 2012-05-10 15:37:38
回答 2查看 349关注 0票数 2

我在这里有点难题要解决。

您有一个时间戳作为参数传递给服务器。例如,2012-5-10 14:55。如果30秒从给定的时间中流逝并返回truefalse,您将如何判断?

规则:

  1. 您不能使用当前服务器时间来检查30秒是否已经过去,因为时间戳来自世界上任何地方,而且总是错误的。在这种情况下,您可以信任传递给服务器的参数时间戳。

在ColdFusion 9中,这是怎么可能的(如果有的话)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-10 15:59:26

嗯……你的问题是你不知道延迟。您可以从收到时间戳的时间起计算30秒,但这可能是创建时间戳之后的秒。

你可以很容易地数到30秒。

代码语言:javascript
复制
sleep(30000); //1000 miliseconds = 1 second. 30k = 30 seconds

因此,一旦得到变量,您就可以“等待”30秒,然后做一些事情。但是从你的问题来看,从时间戳(在客户端上创建)开始,你需要精确的30秒。你可能不能这么精确,因为:

  1. 2时钟不是同步的
  2. 你无法计算请求的延迟。
  3. 即使你可以,因为你不能控制客户端,你将很难保证结果,因为HTTP是无状态的,而不是实时的。

如果您可以指定一个HTML5浏览器,您可以使用websockets来实现它--它实际上是在乞求:),但这是我能想到的唯一真正的解决方案。

票数 3
EN

Stack Overflow用户

发布于 2012-05-10 23:32:03

您没有指定传递给服务器的参数是API请求、表单提交或ajax请求等等,因此在另一端的实现会有所不同。但是,ColdFusion服务器端应该非常相似,基本上包含三个问题:时区、时差和延迟。

要解决时区问题,可以要求将参数作为UTC时间传递。当你将时间和寒冷相比较时,你会做如下的事情:

代码语言:javascript
复制
<cfif DateDiff("s", Variables.PassedTimestamp, DateConvert( "Local2UTC", Now() )) EQ 30>
  <!--- Exactly 30 seconds difference between timestamps --->
</cfif>

但是您不知道发送给您的时间是否与服务器上的时间同步。为了帮助这一点,您可以为另一端提供一种方法来查询您的时间,或者相应地调整他们的时间,或者用他们自己的时间回显您的时间。

时间同步和最初讨论的时间戳发送都会受到延迟的影响。网络上的任何通信都会受到延迟的影响,只是延迟程度不同。位置和Internet连接类型可能比协议类型有更大的影响。您可以执行一些操作,比如敲击另一端以获得响应时间,然后将响应时间减半并将其添加到时间戳中,但这仍然是一个近似,并不是所有的服务器都会响应ping。

此外,服务器和另一端的代码也会引入延迟。为了减少这一点,您希望另一端尽可能接近请求的末尾计算时间戳,并希望您的代码尽快计算时间戳。这可以用ColdFusion来完成,方法是尽可能将请求时间设置在Application.cfm|cfc顶部附近。

代码语言:javascript
复制
<cfset Request.Now = Now()>

然后将检查代码更改为:

代码语言:javascript
复制
DateDiff("s", Variables.PassedTimestamp, DateConvert( "Local2UTC", Request.Now ))

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

得到准确的30秒是不可能的,但你采取的步骤将使你的距离更近。如果你只需要看看大约30秒过去了,那就足够了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10537503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档