2013-08-08 5 views
7

나는 가능한 다양한 시간대를 처리해야하는 웹 사이트를 개발 중입니다. 웹 사이트가 경매와 같이 시간이 많이 드는 이벤트를 주최하기 때문에 이것은 큰 문제가됩니다.서버와 클라이언트 사이의 시간대를 처리하는 방법은 무엇입니까?

서버의 모든 날짜/시간은 UTC로 표시됩니다. 데이터베이스는 모든 항목을 UTC 타임 스탬프로 저장합니다. PHP 기본 시간대는 UTC (date_default_timezone_set('UTC');)로 설정됩니다.

이제 내 문제는 내가 단지 날짜를 표시하고 있는지, 더 중요한지, 사용자 입력으로부터 날짜/시간을 읽는지에 관계없이 사용자와 어떻게 상호 작용해야하는지입니다.

구체적인 예 :

  • 경매 내가 UTC로 데이터베이스에 저장 기한을 가지고 있습니다.
  • 웹 사이트에서 경매를 볼 때 자바 스크립트 타이머는 Date 개체를 사용하여 남은 시간을 계산합니다. 시간대를 자동으로 GMT + 0100 (현지 시간대)으로 변환합니다. 따라서 최종 기한이 '2013-08-08 10:46:08' (UTC) 인 경우 javascript 날짜 객체는 Aug 08 2013 11:26:15 GMT+0100 (GMT Standard Time)을 반환합니다.
  • 현재 시간이 11:46:08보다 큰 경우 타이머는 남은 시간이 00:00 (정확함)라고 표시합니다.
  • 하지만 입찰을 삽입 할 경우, 서버가 MySQL INSERT의 조건 때문에 받아들이는 true로 평가

    INSERT를 입찰 ... ... 그리고 auction_deadline> INTO NOW() ...

    시간대의

(때문에 auction_deadline = NOW '2013-08-08 10:46:08'와() = '2013-08-08 10:26:50')

이 모든 미신적 점보는 내 머리를 녹. 내가 여기서 무엇을 놓치고 있니? 나는 모든 날짜/시간을 UTC로 데이터베이스에 저장하는 것이 최선이라는 것을 거의 확신합니다. 나는 사용자와 데이터베이스 사이에서 어떻게 처리해야하는지 명확하게 생각할 수 없다.

+0

내 질문을 명확하게하기 위해 몇 가지 코드가 필요하면 알려주십시오. –

답변

3

문제는 시간대와 관련이 없습니다. 클라이언트가 시계를 돌리거나 시계를 상당히 비뚤어지게 만들 수 있습니다. 이를 해결하기 위해 서버에서 매번 폴링하여 계산에 사용할 오프셋 수정을 구합니다.

실제로 날짜 개체가 필요하지 않습니다. 경매가 종료되는 특정 보편적 인 순간이 있습니다. 그것이 1375960662823이라고합시다. 지금은 보편적 순간이 1375960669199이므로, 경매가 6 초 만에 종료됨을 알 수 있습니다 (1375960662823 - 1375960669199 ~ 6000). 모로코 나 일본에 상관없이 6 초 안에 끝납니다. 당신은 아직 그것을 이해합니까?

이 숫자를 생성하려면 var now = Date.now() + skewFix을 호출 할 수 있습니다. 여기서 skewFix은 클라이언트가 시간차가 있거나 수동으로 컴퓨터를 잘못된 시간으로 설정 한 경우 적용해야하는 수정입니다.

PHP, 당신은 자바 스크립트 $now = time() * 1000;

0

는 다음을 수행 할 수 있습니다

페이지가로드되면, 사용자의 오프셋 시간대와 서버에 아약스 요청을 보냅니다. 다음 코드를 사용하여 시간대 오프셋을 가져올 수 있습니다. 오프셋

var curdate = new Date() 
var offset = curdate.getTimezoneOffset() 

은 분 오프셋 시간대입니다.

도움이 될 것 같습니다.

0

이것은 다소 일반적인 주제이지만, 대부분은 이해하기에 매우 복잡합니다. 우선 일광 절약을 언급하지 마십시오. 그래 나는 너의 긴장감을 증가시키고있다 :).

이제 어떻게 할 수 있는지 알아 보겠습니다. UTC로 시간을 저장하면 잘 된 것입니다. 이제 회원 등록을하고 각 회원이 선호하는 표준 시간대를 설정할 수있는 기능이 있으면 좋겠다. 그렇지 않으면 서버의 표준 시간대가 표시됩니다.

"시작 시간"을 통해 사용자에게 UTC 시간을 자신의 시간으로 변환 한 후에 보내야 할 때와 비슷하게, 브라우저에서 TIME을 수락 할 때와 마찬가지로 사용자 작업 또는 JavaScript 일 수 있습니다. 사실을 고려하여 그 시간을 UTC로 변환해야합니다 사용자는 자신의 프로필에 대해 선택한 시간대입니다.

당신이 잘못 가고 있다는 생각을 분명히하기를 희망하십니까? 당신이 동일한 논리에 다른 논리를 가지고 나아갈 때 중요한 역할을 할 것이기 때문에 낮의 저축을 통해 읽으십시오.

편집 :

당신은 자바 스크립트의 시간대가 자동 제출 및 자신의 설정에 따라 사용자 입력 오프셋 사용할 수 있습니다. 당신은 클라이언트 측에서 날짜를 얻을 때

0

때마다, 당신은 UTC 날짜 예에 변환 할 getUTC를 사용할 수 있습니다

var todayDate = new Date(); 

var todayDateInUTC = new Date(todayDate.getUTCFullYear(), todayDate.getUTCMonth(), todayDate.getUTCDate(), todayDate.getUTCHours(), todayDate.getUTCMinutes(), todayDate.getUTCSeconds()); 
당신이 데이터베이스에 입찰 날짜를 삽입 변환 할 getUTC 기능을 사용하기 전에 너무 좋아

UTC 형식으로 변환합니다.

1

날짜 현지 시간대를 사용하여 그것을 생성 할 수 있습니다. 사용자는 UTC 시간을 받아 서버로 보내야합니다.

new Date 
Thu Aug 08 2013 17:00:14 GMT+0530 (India Standard Time) 
(new Date("Thu Aug 08 2013 17:00:14")).toUTCString(); 
"Thu, 08 Aug 2013 11:30:14 GMT" 

이렇게하면 서버와 클라이언트 간의 표준 시간대 문제가 해결됩니다.

1

당신은 말했다

(때문에 auction_deadline = NOW '2013년 8월 8일 10시 46분 8초'와() = '2013년 8월 8일 10시 26분 50초')

MySQL에서 - NOW은 서버의 현지 시간대 (docs)에서 현재 시간을 반환합니다.

아마도 UTC_TIMESTAMP과 같은 것이 현재 시간을 UTC (docs)으로 반환합니다.

또한 클라이언트 JavaScript에서 입력 시간을 전혀 허용하지 않아야합니다. 자신의 시계 만 신뢰하십시오. 입찰가가 설정되면 MySQL 또는 PHP에서 서버의 시간을 사용하십시오. 그것을 입력으로 받아들이지 마십시오.

관련 문제