TIP게시판

제목 글로벌 사이트를 위한 시간(GMT) 적용
글쓴이 변종원(웅파) 작성시각 2011/10/12 10:28:40
댓글 : 10 추천 : 0 스크랩 : 1 조회수 : 21498   RSS
1. 우선 입력할때는 codeigniter date helper의 now() 함수를 사용합니다.
    사용하기 위해서 config.php를 수정해줘야 gmt 시간을 사용할 수 있습니다.
$config['time_reference'] = 'gmt';
//기본값이 local로 되어 있습니다.
//제 경우엔 autoload에 선언
$this->load->helper('date');

$time = now(); //위의 time_referense 가 gmt 이므로 gmt timestamp를 반환합니다.

2. gmt시간을 local로 바꿔줄때는 현재 타임존을 입력해줘야 하는데 이 부분이 수동이라 자바스크립트의  
getTimezoneOffset() 함수를 이용하여 gmt와 현재 클라이언트PC 시간의 차이를 가져옵니다.
(제 경우엔 사이트 전체에서 사용해야 해서 hook에 구현을 했습니다만 일반적인 경우엔 그냥 선언해서 쓰시면 됩니다)
//hook으로 구현한 내용입니다. 꼼수. ^^

        ob_start();
 ?>
 <script language="javascript" type="text/javascript">
  now = new Date();
  localtime = now.getTimezoneOffset();
  [removed](localtime);
 </script>
 <?php
 $g = ob_get_contents();
 ob_end_clean();

 define('GMT_DIF', $g);

실제로 변환하는 함수입니다.
         /**
  * gmt timestamp 를 local timestamp 변환
  * 
  * @author Jongwon Byun <codeigniterk@gmail.com>
  * @param string $time : gmt timestamp
  * @param string $daylight_saving : 섬머타임
  * @return string $local_timestamp : local 기준으로 변환된 timestamp
  */
 function gmt_2_local($time, $daylight_saving='false') 
  {
   //hook에서 선언한 gmt와 local의 시간차이에 따른 타임존 구하기
   switch (GMT_DIFF) 
     {
      case ('720'):
    $time_zone = 'UM12'; 
        break;
        case ('660'):
    $time_zone = 'UM11'; 
        break;
        case ('600'):
    $time_zone = 'UM10'; 
        break;
        case ('540'):
    $time_zone = 'UM9'; 
        break;
        case ('480'):
    $time_zone = 'UM8'; 
        break;
        case ('420'):
    $time_zone = 'UM7'; 
        break;
        case ('360'):
    $time_zone = 'UM6'; 
        break;
        case ('300'):
    $time_zone = 'UM5'; 
        break;
        case ('240'):
    $time_zone = 'UM4'; 
        break;
        case ('210'):
    $time_zone = 'UM35'; 
        break;
        case ('180'):
    $time_zone = 'UM3'; 
        break;
        case ('120'):
    $time_zone = 'UM2'; 
        break;
        case ('60'):
    $time_zone = 'UM1'; 
        break;
        case ('0'):
    $time_zone = 'UTC'; 
        break;
        case ('-60'):
    $time_zone = 'UP1'; 
        break;
        case ('-120'):
    $time_zone = 'UP2'; 
        break;
        case ('-180'):
    $time_zone = 'UP3'; 
        break;
        case ('-210'):
    $time_zone = 'UP35'; 
        break;
        case ('-240'):
    $time_zone = 'UP4'; 
        break;
        case ('-270'):
    $time_zone = 'UP45'; 
        break;
        case ('-300'):
    $time_zone = 'UP5'; 
        break;
        case ('-330'):
    $time_zone = 'UP55'; 
        break;
        case ('-360'):
    $time_zone = 'UP6'; 
        break;
        case ('-420'):
    $time_zone = 'UP7'; 
        break;
        case ('-480'):
    $time_zone = 'UP8'; 
        break;
        case ('-540'):
    $time_zone = 'UP9'; 
        break;
        case ('-570'):
    $time_zone = 'UP95'; 
        break;
        case ('-600'):
    $time_zone = 'UP10'; 
        break;
        case ('-660'):
    $time_zone = 'UP11'; 
        break;
        case ('-720'):
    $time_zone = 'UP12'; 
        break;
     }
     
     $local_timestamp = gmt_to_local($time, $time_zone, $daylight_saving);
   
   return $local_timestamp;
  }

사용법은 다음과 같습니다.
$local_timestamp = gmt_2_local($gmt_timestamp);


작업하다가 덤으로 매뉴얼의 오타도 발견했습니다.

date helper Timezone Reference에 UM25 -> UM35 가 맞습니다.

저런 식으로 뒷자리가 2자리로 되어 있는 값들은 전부 +1을 해줘야 합니다.

UP45 -> UP55



태그 gmt,local,timestamp
 다음글 eclipse Autocomplete 업데이트 버전. (4)
 이전글 포토바다 개발 내규 문서 공개합니다. (10)

댓글

변종원(웅파) / 2011/10/12 10:30:41 / 추천 0
ci의 진가가 나타나네요. 두번째 소스중 8번 라인

[removed](localtime);  -> [removed](localtime); 입니다.
ci가 자동변환해버렸네요. ^^


위와 같이 만든 이유는 개발자가 신경 안쓰고 개발하도록 하기 위해서입니다.
한대승(불의회상) / 2011/10/12 12:42:52 / 추천 0
웅파// 수고 하셨습니다. ^^
좋은 코드 공개해 주셔서 고맙습니다.

댓글에 언급한 부분이 자동변환이 되서 원래 뭐였는지 알 수가 없네요 ^^
변종원(웅파) / 2011/10/12 13:25:22 / 추천 0
우띠.... document . write 입니다. ㅎㅎㅎ
한대승(불의회상) / 2011/10/12 13:50:04 / 추천 0
그렇군요.. ㅎㅎㅎㅎ 
XSS 필터링에 의해 삭제 된거군요 ^^
들국화 / 2011/10/12 15:32:18 / 추천 0
 아항... 필터링 되면 removed로 뜨는거군요.. 전또 뭔가 했다는.. ㅡㅡ;
변종원(웅파) / 2012/01/11 12:28:33 / 추천 0
추가......  

2번 사항을 hook에서 꼭 처리하려다 보니 저렇게 됐는데 헤더에 선언하는 js 파일안으로 옮겼습니다.
그리고 상수로 선언하지 않고 자바스크립트에서 쿠키로 구웠습니다.

//gmt 시간 체크를 위한 클라이언트 시간값
now = new Date();
localtime = now.getTimezoneOffset();
[removed] = "gmt_diff="+localtime;

그리고 사용할때는 
$this->input->cookie('gmt_diff', TRUE);

꼭 hook을 이용하려고 생각을 고정시킬 필요는 없는데 고집하니 저런 소스가 나왔네요. ^^

그리고 브라우저 gzip 압축을 이용하려다 보니 ob_start() 같은게 먼저 선언되면 안되서 방식을 바꾼 겁니다.
변종원(웅파) / 2012/01/11 12:29:32 / 추천 0
위에 [removed] 는 document . cookie 입니다.
똑똑한 ci... ㅎㅎㅎ
한대승(불의회상) / 2012/01/11 12:47:51 / 추천 0
 ㅋㅋㅋㅋ 
홍구2 / 2012/10/21 12:18:13 / 추천 0
글로벌 사이트를 제작할 때에 제가 쓰는 방법은 아래와 같은데, 제가 잘못 이해하고 있는 것인지 모르겠습니다ㅎ 저는 아래와 같이 방법이 더 간단하다고 생각하는데, 문제가 있으면 말씀해주세요~

1. 기록시에는 불변의 절대값으로만 저장
 php에서의 time()은 절대값이므로 DB에 기록시 int(10) unsigned의 형태로 기록한다. 제가 알기로 서버의 timezone 셋팅과 상관없이 항상 January 1 1970 00:00:00 GMT 기준으로 하기에 절대값으로 볼 수 있다고 생각합니다.
ex) 132039273

2. 출력시에 클라이언트의 timezone을 기반으로 재해석을 하여 표시
 php상에서 쓴다면 date_default_timezone_set()을 이용하여 표시되는 기준을 바꾸거나, 혹은 저장된 timestamp를 원문대로 보내고 자바스크립트에서 local timezone에 맞추어서 표시하는 방법을 씁니다.

변종원(웅파) / 2012/10/21 13:17:13 / 추천 0
홍구/ 관점 차이겠지요. 전 서버에서 시간을 만들어서 클라이언트로 보내려고 그렇게 한 것이구요.
전 2번에서 꽁수로 클라이언트의 시간대를 구해서 서버에서 그걸로 시간을 변경한 것이고
홍구님은 시간을 그냥 보내고 클라이언트에서 자바스크립트로 변경을 하여 사용하시는 거구요. ^^

date_default_timezone_set()을 사용하려면 파라미터로 현재 타임존을 넘져줘야 하는데 php에서는 
클라이언트의 타임존을 가져올 방법이 없었습니다. 

글로벌이라도 접속했을 때 클라이언트에 따라 자동으로 시간을 해줄 것인지 사이트에서 en.xxx.com으로
이동을 해서 값을 알고 있는 상태에서의 구현이 틀려서 그렇게 한 겁니다.

그리고 서버가 한국뿐만 아니라 각국에 위치할 것도 고려를 했습니다.