제목 | 글로벌 사이트를 위한 시간(GMT) 적용 | ||
---|---|---|---|
글쓴이 | 변종원(웅파) | 작성시각 | 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 | ||
다음글 | eclipse Autocomplete 업데이트 버전. (4) | ||
이전글 | 포토바다 개발 내규 문서 공개합니다. (10) | ||
변종원(웅파)
/
2011/10/12 10:30:41 /
추천
0
|
한대승(불의회상)
/
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으로 이동을 해서 값을 알고 있는 상태에서의 구현이 틀려서 그렇게 한 겁니다. 그리고 서버가 한국뿐만 아니라 각국에 위치할 것도 고려를 했습니다. |
[removed](localtime); -> [removed](localtime); 입니다.
ci가 자동변환해버렸네요. ^^
위와 같이 만든 이유는 개발자가 신경 안쓰고 개발하도록 하기 위해서입니다.