CodeIgniter 한국사용자포럼 BETA
빠르고, 유연한 PHP Framework!

TIP게시판


글로벌 사이트를 위한 시간(GMT) 적용      
웅파 8 946 0 0 2011-10-12 10:28:40
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
  목록  

웅파 2011-10-12 10:30:41
  
ci의 진가가 나타나네요. 두번째 소스중 8번 라인

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


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

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

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
  
위에 [removed] 는 document . cookie 입니다.
똑똑한 ci... ㅎㅎㅎ
불의회상 2012-01-11 12:47:51
  
 ㅋㅋㅋㅋ 
번호 제   목 글쓴이 날짜 조회 추천수
862 form validation 에서 한글 체크 규칙 [3] sliplife 2012-05-14 123 0
859 간단한 웹페이지 캐쉬처리 라이브러리 (스마티 캐쉬 .. [3] sliplife 2012-05-10 174 0
855 워드프레스 + Codeigniter [4] 이현석 2012-05-07 240 0
850 CLI 모드로 실행할 때 로그파일 관련문제 [1] 사랑완샷 2012-04-09 270 0
848 Customization Pagination (페이.. [1] 얼짱짠군 2012-04-02 506 0
845 db library 에서 save_queries 옵.. [3] pithecus 2012-03-29 355 0
842 세션 분실 && 읽지못함 관련 팁...이 될 수 있.. [1] 밥아저씨 2012-03-10 658 0
836 Hook을 이용한 preload 이이지 구현에 대한.. [3] 핵잠함장 2012-02-22 590 0
833 CI_Cache_memcached 드라이버 버그 수정 [2] 한글이 2012-02-22 546 0
829 HMVC 5.4 & Template_ 타로구조 만들기 [2] 타로 2012-02-02 1003 0
824 CI lang팩 -> Javascript lang팩 [4] KangMin 2012-01-25 788 0
823 anchor_popup 헬퍼 화면 정 가운데 띄우기.. [0] DJ구스 2012-01-17 661 0
822 [자바스크립트] 창을 화면 정중앙에 위치하게 계산하기 [1] 웅파 2012-01-11 703 0
815 hook에서 선언한 변수를 컨트롤러에서 사용하기 [2] 웅파 2011-12-27 867 0
812 mysql 부분적인 에러 핸들링 처리 [2] EziX 2011-12-20 866 0
811 컨트롤러 외부에서의 종료방법 [1] EziX 2011-12-20 695 0
809 icodekore sms 모듈 쓰는 분들 참고하세요.. [0] namGoos 2011-12-09 935 0
803 Upgrading from 2.0.3 to 2.1.0 [5] namGoos 2011-12-06 908 0
794 .svn 폴더 삭제 하기 [7] 불의회상 2011-11-30 1066 1
792 [1원] 윈도우서버+mssql 에서 CLI(Comm.. [2] 터프키드 2011-11-29 983 0