2012-05-10 1 views
2

여기 CF에서 해결할 퍼즐의 1 비트.어떻게 서버 시간을 모른 채로 DateDiff를 사용합니까?

서버에 인수로 전달 된 타임 스탬프가 있습니다. 예 : 2012-5-10 14:55. 주어진 시간에서 30 초가 지난 후 true 또는 false을 반환하면 어떻게됩니까?

규칙 : 당신은 타임 스탬프는 세계 어디에서나 오기 때문에 30 초 통과 여부를 확인하기 위해 현재 서버 시간을 사용할 수 없습니다 항상 잘못된 것

  1. .

  2. 이 경우 서버에 전달 된 인수 timestamp를 항상 신뢰할 수 있습니다.

어떻게하면 ColdFusion 9에서 가능합니까?

답변

3

흠 ... 문제는 대기 시간을 모르는 것입니다. 이 타임 스탬프을 수신 한 후 30 초를 계산할 수 있지만 타임 스탬프가 생성 된 후 몇 초가 걸릴 수 있습니다.

당신은 ... 쉽게 충분히 30 초 셀 수 그래서 빨리 당신이 서른 초 동안 "대기"를 선택한 다음 일을 할 수있는 VAR를 얻을로

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

. 그러나 귀하의 질문에서 시간 (클라이언트에서 만든) 만든 시간에서 정확한 30 초 필요 한 것처럼 보입니다.

  1. 2 개의 시계가 동기화
  2. 에없는 당신은 요청의 대기 시간을 알아낼 수 없습니다 : 당신은 아마 정확한 그것 때문에 할 수 없습니다.
  3. HTTP를 상태 비 저장하고 실시간이 아니기 때문에 가능한 경우에도 클라이언트를 제어하지 않으므로 을 보장하는 데 문제가 있습니다. 그것은 실제적으로 그것을 위해 구걸 :)하지만 내가 생각할 수있는 유일한 해결책이다 -

당신이 이것에 대한 WebSocket을을 사용할 수있는 HTML5 브라우저를 지시 할 수있는 경우.

+0

정확한 시간은 타임 스탬프에서 30 초가 필요합니다. 당신이 말한 모든 것이 합리적이고 내 결론은 같았습니다 ... DB/Ram에 아마도 시간을 저장하지 않는 한. 그래서 여기에 간다 ...... 만약 내가 처음 서버 시간을 살펴보고 요청을 받았다면 이것이 요청 시작일 것이다. 내 시간대 밖에서 앱을 사용하기 때문에 요청이 항상 시간 초과 된 것처럼 보이는 문제가 생깁니다. 나는 애플 리케이션이 이것을 다르게 처리 할 것이라고 확신한다. – Prometheus

+0

다른 방법. 사용자가 먼저 요청을합니다.> GET TIME. 그런 다음 두 번째 호출에서이 시간을 사용합니다. – Prometheus

+0

웹 소켓이 있으면 이벤트를 발생시키고 타임 스탬프를 보내고 서버를 다시 작동시켜 30 초 마커를 보냅니다 .... 몇 밀리 초가 지나면 닫을 수 있습니다. 브라우저에서. –

1

서버에 전달 된 인수가 API 요청, 양식 제출 또는 아약스 요청 등일 경우 지정하지 않으므로 상대방 구현에 차이가 있습니다. 그러나 ColdFusion 서버 끝은 매우 유사해야하며 기본적으로 3 가지 문제가 있습니다. 시간대, 시간 불일치 및 대기 시간.

표준 시간대 문제를 해결하려면 인수를 UTC 시간으로 전달해야 할 수 있습니다. ColdFusion과 함께 시간을 비교하면 당신은 같은 것을 할 것 :

<cfif DateDiff("s", Variables.PassedTimestamp, DateConvert("Local2UTC", Now())) EQ 30> 
    <!--- Exactly 30 seconds difference between timestamps ---> 
</cfif> 

을하지만 전송 시간이 서버의 시간과 동기화되어 있는지 모르겠어요. 이를 돕기 위해 상대방이 시간을 쿼리하고 그에 따라 시간을 조정하거나 자신의 시간을 에코 백하는 방법을 제공 할 수 있습니다.

타임 싱크와 원래 논의 된 타임 스탬프의 전송은 둘 다 대기 시간에 시달릴 것입니다.네트워크를 통한 모든 통신은 대기 시간이 다르며 대기 시간이 다양합니다. 위치 및 인터넷 연결 유형은 프로토콜 유형보다 많은 영향을 줄 수 있습니다. 응답 시간을 얻고 시간 길이를 반으로 줄이고 타임 스탬프에 추가하는 등의 작업을 수행 할 수는 있지만 여전히 모든 서버가 ping에 응답하지는 않습니다.

또한 서버의 코드와 다른 쪽에서도 대기 시간이 도입됩니다. 이를 줄이려면 상대방이 가능한 한 요청의 끝과 가까운 시간 소인을 계산하도록하고 가능한 한 빨리 시간 소인을 계산하는 코드를 생성하십시오. 가능한 한 Application.cfm | cfc 상단에 요청 시간을 설정하여 ColdFusion에서이 작업을 수행 할 수 있습니다. 당신의 응답에 표시되지 않습니다, 응답 후 경과

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

만약, 대신, 당신은 루프를 원하는하고 30 일까지 초 :

<cfset Request.Now = Now()> 

그리고 한 다음에 검사 코드를 변경 대기 시간이 응답을 다른 쪽 끝으로 지연시키기 때문에 30 초 후에 발생합니다.

정확히 30 초를 얻는 것은 불가능하지만 더 가까이 갈 수있는 조치를 취하십시오. 약 30 초가 경과했는지 확인하기 만하면 충분합니다.