[PHP] 단기, 우리말 달 이름 지원하는 날짜 변환 메쏘드 #2

코드를 좀 더 다듬고, 요일 표기라든지 ISO8601이라든지 등을 추가.
무엇보다도 입력해야 하는 매개변수를 홱 줄이고 지정자만으로 모든 걸 처리할 수 있게 한 건 제법 쏠쏠한 수확입니다.

혹시 가져가 쓰실 분 있으면 언질이라도 주세요.


...........................................................


class mh_conv_datetype {


// raw_date : 임의로 정의한 형태로 받아온 지정 시각
// raw_date_dat : raw_date를 통해 받은 데이터를 각기 년월일시분초로 나눠 넣은 배열
// conv_date : 단기와 우리말 달이름 처리를 마친 문자열
// conv_date_dat : conv_date와 같이 변환한 데이터를 각기 년월일시분초로 나눠 넣은 배열.
// month_k_dat : 우리말 달 이름을 넣을 배열
// weekday_k1_dat : 우리말 요일 이름을 넣을 배열
// weekday_k2_dat : 우리말 요일 이름을 넣을 배열
// replace_dat : $format에서 갈아넣을 데이터들을 정의한 배열

var $raw_date;
var $raw_date_dat=array();
var $conv_date;
var $conv_date_dat=array();
var $month_k_dat=array();
var $weekday_k1_dat=array();
var $weekday_k2_dat=array();
var $replace_dat=array();


##---------------------------------------------------------------------------


/*

날짜 변환 메쏘드 conv_t2d()
unixtimestamp → date

작성 4337.08.25.
개조1 4340.01.07.
개조2 4340.01.27.
용법 conv_t2d(int timestamp, string format, int cipher)


예시 :

$regdate_a=new mh_conv_datetype;
$regdate_b=$regdate_a->conv_t2d(time(),"Y-m-d H;i:s",1);
print_r($regdate_b);

결과 :

2007-01-27 07:03:12

Array (
[conv_date] => 2007-01-27 07:03:12
[conv_date_dat] => Array (
[seconds] => 12 [minutes] => 03 [hours] => 07 [mday] => 27 [wday] => 06 [mon] => 01 [year] => 2007 [yday] => 26 [weekday] => Saturday [month] => January [0] => 1169848992 [year_dangi] => 4340 [month_k] => 해오름달 [weekday_k1] => 토요일 [weekday_k2] => 흙날
)
)

참고 :

date() 함수의 format 정의 문자들을 그대로 이용할 수 있으며(http://kr.php.net/manual/kr/function.date.php 참조),
우리식 표현에 해당하는 문자열을 섞어 쓸 수 있다.
이를테면 MK는 우리말 달이름(해오름달, 시샘달 등), DK는 한자말 요일 이름(월화수목금토일),
LK는 우리말 요일 이름(해날, 달날, 불날, 물날 등), YK는 단기(서기+2333)다.

매개변수 가운데 마지막에 자리한 $cipher는 자리수로 conv_date_dat 배열로 돌려받는 내용들 가운데
숫자들이 10보다 작을 때 앞에 0을 붙일 것인지 말 것인지를 결정한다.
기본은 1이며, 1로 지정하면 0을 붙여 두 자리로 만들고 0으로 지정하면 한 자리로 둔다.

$regdate_a=new mh_conv_datetype;
$regdate_b=$regdate_a->conv_t2d(time(),"YK년 MK(m월) d일 AK H시 j분 s초 LK(DK)",1);

…로 지정한 경우 결과는 다음과 같다.

Array (
[conv_date] => 4340년 해오름달(1월) 27일 이른 07시 27분 29초 흙날(토요일)
[conv_date_dat] => Array (
[seconds] => 29 [minutes] => 12 [hours] => 07 [mday] => 27 [wday] => 06 [mon] => 01 [year] => 2007 [yday] => 26 [weekday] => Saturday [month] => January [0] => 1169849549 [year_dangi] => 4340 [month_k] => 해오름달 [weekday_k1] => 토요일 [weekday_k2] => 흙날
)
)

국제표준 표기인 ISO8601 표기는 PHP5에서는 date함수에서 c라는 지정자로 지원하나 PHP4까지는 없어서 추가.

$regdate_a=new mh_conv_datetype;
$regdate_b=$regdate_a->conv_t2d(time(),"ISO8601");
echo $regdate_b['conv_date'];

결과는 2007-01-27T07:58:20+09:00 으로 나온다.

* 매개변수 가운데 형식(format)과 자릿수(cipher)는 생략할 수 있다. 형식을 생략하면 연-월-일 시:분:초로,
자릿수를 생략하면 두 자리로 임의 정의한다.

$regdate_a=new mh_conv_datetype;
$regdate_b=$regdate_a->conv_t2d(time());
echo $regdate_b['conv_date'];

결과는 2007-01-27 07:03:12 로 나온다.

*/


function conv_t2d($timestamp,$format="Y/m/d H:i:s",$cipher=1) {

// month_k_dat :우리말 달이름
// weekday_k1_dat : 한자말 요일 이름
// weekday_k2_dat : 우리말 요일 이름

$this->month_k_dat=array("해오름", "시샘", "물오름", "잎새", "푸른", "누리", "견우직녀", "타오름", "열매", "하늘연", "미틈", "매듭");
$this->weekday_k1_dat=array("일", "월", "화", "수", "목", "금", "토");
$this->weekday_k2_dat=array("해", "달", "불", "물", "나무", "쇠", "흙");

// raw_date_dat에 getdate를 이용해 날짜, 시간 정보를 배열로 저장.
// getdate로 할당되는 각 배열 키는 다음과 같다.
// seconds(초), minutes(분), hours(시), mday(월), wday(요일), mon(월), year(연도),
// yday(그 해 몇 번째 날), weekday(요일 영문자), month(월 영문자)
// 여기에 year_dangi(단기 연도 : 서기+2333), month_k(우리말 달 이름),
// weekday_k1(한자말 요일), weekday_k2(우리말 요일)를 덧붙임

$this->raw_date_dat=getdate($timestamp);
$this->raw_date_dat['year_dangi']=$this->raw_date_dat['year']+2333;
$this->raw_date_dat['month_k']=$this->month_k_dat[$this->raw_date_dat['mon']-1]."달";
$this->raw_date_dat['weekday_k1']=$this->weekday_k1_dat[$this->raw_date_dat['wday']]."요일";
$this->raw_date_dat['weekday_k2']=$this->weekday_k2_dat[$this->raw_date_dat['wday']]."날";

// getdate로 얻은 값들은 10 이하 숫자가 모두 한자리로만 출력됨.
// foreach를 돌려 한자리인 경우 앞에 0이 붙은 문자열로 바꿔 해당 키에 도로 집어넣는다.
// 문자로 보아 길이가 2 이하인 경우만 바꾸므로 문자값이거나 timestamp인 경우 무시.
// 매개변수 cipher가 있으면(1) 작동. 없으면(0) 무조건 1자릿수로 간주한다.

if($cipher){
foreach($this->raw_date_dat as $key=>$value){
if(strlen((string)$this->raw_date_dat[$key])<2) {
$this->raw_date_dat[$key]="0".$this->raw_date_dat[$key];
}
}
}

// date 함수에 지정하는 기본 출력 형식 외에 우리식 표현을 위한 문자열을 추가하기 위한 배열.
// 지정자는 우리말 달이름(MK), 한자말 요일 이름(DK), 우리말 요일 이름(LK), 단기 연도(YK)로 K가 붙음.
// 기본 형식들은 건드리지 않고 몇몇 문자에 대문자 K를 붙여 구별한다.
// replace_dat 배열의 각 키에 미리 정의해 둔 우리식 표현들을 맞춰넣는다.
// 형식 중 y는 연도를 두 자리로 표기하는 것(Y는 네 자리)이므로 단기 변환은 YK만 허용.
// 한편 ISO8601은 날짜와 시간 표기를 위한 국제표준으로 PHP5에서는 date 함수 안에 c라는 지정자로 표기하는 것.
// PHP4까지는 없기에 따로 준비한 항목이다. 이 문자가 있는 경우, Y-m-dTH:i:s+09:00 형태로 변환한다.
// 이 형식은 RSS 파일과 같은 곳에 날짜를 써야 할 때 많이 쓰인다.

$this->replace_dat=array(
"MK"=>$this->raw_date_dat['month_k'],
"DK"=>$this->raw_date_dat['weekday_k1'],
"LK"=>$this->raw_date_dat['weekday_k2'],
"YK"=>$this->raw_date_dat['year_dangi'],
"ISO8601"=>"Y-m-d\TH:i:s+09:00"
);

// foreach를 돌려 date에 넣기 위해 받아온 $format 매개변수에서 'K'가 붙는 것들을
// $format 안에 직접 바꿔 넣는다. 기본 형식엔 없는 것들이니 직접 써 넣어줘야 한다.
// 단 ISO8601의 경우 뒤이어 나올 date 함수에서 변환하게끔 있는 녀석으로 바꿔준다.

foreach($this->replace_dat as $key=>$value){
$format=str_replace($key,$value,$format);
}

// 바꾼 형식으로 date 함수를 돌린다. date는 timestamp를 받아 지정 형식으로 날짜를 출력해준다.

$this->raw_date=date($format,$timestamp);

// 형식 정의에서 ak(AK)가 있으면 am(AM)은 오전, pm(PM)은 오후로 바꾼다.
// format에 ak나 AK가 있는 경우, date를 통과하면 각기 amk(AMK)나 pmk(PMK)가 된다.
// 따라서 통째로 오전, 오후로 바꿔주는 것이다.
// 앞서 배열에서 처리하지 않은 까닭은 getdate 함수가 만드는 배열에는 오전 오후를 구분하는
// 키가 따로 없기 때문. 결국 나온 결과값을 바꿔줘야 하기 때문이다.

if(ereg("ak",$format)){
$this->raw_date=str_replace("amk","오전",$this->raw_date);
$this->raw_date=str_replace("pmk","오후",$this->raw_date);
} elseif(ereg("AK",$format)) {
$this->raw_date=str_replace("AMK","이른",$this->raw_date);
$this->raw_date=str_replace("PMK","늦은",$this->raw_date);
}

// 이렇게 변환처리가 끝난 날짜는 conv_date로,
// 년월일시분초를 비롯한 각각의 분할 데이터는 conv_date_dat 배열로 묶어
// 돌려준다.

return array("conv_date"=>$this->raw_date,"conv_date_dat"=>$this->raw_date_dat);

}


##---------------------------------------------------------------------------


/*

날짜 변환 메쏘드 conv_d2t()
date → unixtimestamp

작성 4337.08.26.
개조 4340.01.07.
용법 conv_d2t(int year, int month, int day, int hour, int minute, int second)

예시

$regdate_a=new mh_conv_datetype;
$regdate_b=$regdate_a->conv_d2t(4340,1,13,3,50,0);
echo $regdate_b."<br/>";
// 4340(2007)년 1월 13일 3시 50분 0초를 넣으면 돌려받는 값은 1168627800.
$regdate_c=$regdate_a->conv_t2d($regdate_b,"YK-MK(m월)-d일 H시 i분 s초 DK(LK)");
echo $regdate_c['conv_date']."<br/>";
// 확인해 보면 2007/01/13 03:50:00 → 4340-해오름달(01월)-13일 03시 50분 00초 토요일(흙날).

*/

function conv_d2t($year,$month,$day,$hour,$minute,$second)
// 연월일시분초 순으로 매개변수를 받음
{
if($year>4000) $year=$year-2333;
// 입력받은 수치가 단기라면(4000이 넘으면) 2333을 빼 서기로 변환.
$this->timestamp=mktime($hour,$minute,$second,$month,$day,$year);
// timestamp 도출
return $this->timestamp;
// timestamp 돌려줌.
}


}

by 서찬휘 | 2007/01/27 08:02 | 셈틀놀이 | 트랙백 | 덧글(1)

트랙백 주소 : http://seochnh.egloos.com/tb/1498099
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 烏有 at 2007/01/27 14:46
우와..........'ㅂ'멋지네요

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶