그래서 그냥 1년 부터 구하도록 만들었습니다.
근데 문제는. 1년부터 1582년 10월 14일 까지는.. 가상의 날짜입니다.
현재 사용되는 달력은 1582년 10월 15일부터 고정되었다고 하더군요..
함수는. new_date와 new_mktime 이며 사용법은 같습니다.
그리고 아직 미완성이기 때문에.. 주로 사용되는 포맷만 구현되어있습니다 ^^;;
거기에 하나더 미완성인게.. new_mktime 의 인자값으로 음수가 들어갈경우는 처리가 되어있지 않습니다.. 지금 작업할게 있어서요 ㅋ
아래 내용을 복사해서 라이브러리에 넣어두고 사용하시면됩니다.
버그나 수정사항은 직접고치셨다면 여기에 올려주시면 감사하겠습니다. (__)
(902년 부터 뽑아주는 함수를 조금 참고했습니다.)
<?
/*
+---------------------------------------------------------------------+
| Copyleft (L) 2005.1.9 by NiL |
+---------------------------------------------------------------------+
| 본 프로그램은 제작자와는 전혀 무관하게 맘대로 복사, 수정, 파손 |
| 또는, 대여, 판매할수 있습니다. |
| 수정된 소스는 제작자와 많은 사람들과 공유되기를 원합니다. |
+---------------------------------------------------------------------+
| Author: Park J. NiL <nils@jnils.net> |
+---------------------------------------------------------------------+
*/
function is_leaf_year($y) {
if(($y % 400) == 0) return true;
else if(($y % 100) == 0) return false;
else if(($y % 4) == 0) return true;
else return false;
}
function new_mktime($hour, $min, $sec, $month, $day, $year) {
$hour = intval($hour);
$min = intval($min);
$sec = intval($sec);
$month = intval($month);
$day = intval($day);
$year = intval($year);
$month_arr[0] = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$month_arr[1] = array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$_days = 0;
$_secs = 0;
$normal_year_days = 365;
$leaf_year_days = 366;
$_day_sec = 86400;
$_hour_sec = 3600;
$_min_sec = 60;
$_day_min = 1440;
$_hour_min = 60;
$_day_hour = 24;
$_timestamp = 0;
// 초 더하기
$secs = $sec;
// 분을 초로
$secs += $min * $_min_sec;
// 시를 초로
$secs += $hour * $_hour_sec;
// 날 더하기
$days = $day;
// 월을 날짜로
$_year_cnt = floor(($month - 1) / 12);
$month = $month % 12;
for($i = 0; $i < $month - 1; $i++)
{
$_month = ($i % 12) + 1;
$leaf_flg = 0; // 기본값으로 윤달 아님
if($_month == 2) // 2월이면 윤달 체크
{
if(is_leaf_year($year + $_year_cnt)) $leaf_flg = 1;
else $leaf_flg = 0;
}
$days += $month_arr[$leaf_flg][$i];
}
// 년을 날짜로
$year += $_year_cnt;
for($i = 1; $i < $year; $i++)
{
$_year = $i;
$days += is_leaf_year($_year) ? $leaf_year_days : $normal_year_days;
}
$_timestamp = ($days * $_day_sec) + $secs;
return $_timestamp;
}
function get_days(&$t)
{
$day_sec = 86400;
$days = floor($t / $day_sec);
$t = $t - (floor($t / $day_sec) * $day_sec);
return $days;
}
function get_date($d)
{
$leaf_year_days = 366;
$normal_year_days = 365;
$month_arr[0] = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$month_arr[1] = array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$year = 0;
$month = 0;
$day = 0;
$flg = true;
while($flg)
{
$year++;
if(is_leaf_year($year))
{
if($d > $leaf_year_days) $d -= $leaf_year_days;
else $flg = false;
$leaf_flg = 1;
}
else
{
if($d > $normal_year_days) $d -= $normal_year_days;
else $flg = false;
$leaf_flg = 0;
}
}
$month_cnt = 0;
while($d > $month_arr[$leaf_flg][$month_cnt])
{
$d -= $month_arr[$leaf_flg][$month_cnt];
$month_cnt++;
}
$month = $month_cnt + 1;
$day = $d;
return sprintf("%04d%02d%02d", $year, $month, $day);
}
function get_time($t)
{
$hour_sec = 3600;
$min_sec = 60;
$hour = floor($t / $hour_sec);
$min = floor(($t % $hour_sec) / $min_sec);
$sec = $t % $min_sec;
return sprintf("%02d%02d%02d", $hour, $min, $sec);
}
function cal_date($t)
{
if($t == "")
{
return date("YmdHis");
}
else
{
$days = get_days(&$t);
$date = get_date($days);
$time = get_time($t);
return $date.$time;
}
}
function new_date()
{
if(func_num_args() != 1 && func_num_args() != 2) return false;
$format = func_get_arg(0);
$timestamp = func_get_arg(1);
$date = cal_date($timestamp);
$year = substr($date, 0, 4);
$month = substr($date, 4, 2);
$day = substr($date, 6, 2);
$hour = substr($date, 8, 2);
$min = substr($date, 10, 2);
$sec = substr($date, 12, 2);
$out_buf = "";
for($i = 0; $i < strlen($format); $i++)
{
$c = substr($format, $i, 1);
switch ($c)
{
case "a":
$out_buf .= $hour < 12 ? "am" : "pm";
break;
case "A":
$out_buf .= $hour < 12 ? "AM" : "PM";
break;
case "B":
break;
case "c":
break;
case "d":
$out_buf .= sprintf("%02d", $day);
break;
case "D":
break;
case "F":
break;
case "g":
$out_buf .= sprintf("%d", (($hour - 1) % 12) + 1);
break;
case "G":
$out_buf .= sprintf("%d", $hour);
break;
case "h":
$out_buf .= sprintf("%02d", (($hour - 1) % 12) + 1);
break;
case "H":
$out_buf .= sprintf("%02d", $hour);
break;
case "i":
$out_buf .= sprintf("%02d", $min);
break;
case "I":
break;
case "j":
$out_buf .= sprintf("%d", $day);
break;
case "l":
break;
case "L":
break;
case "m":
$out_buf .= sprintf("%02d", $month);
break;
case "M":
break;
case "n":
$out_buf .= sprintf("%d", $month);
break;
case "O":
break;
case "r":
break;
case "s":
$out_buf .= sprintf("%02d", $sec);
break;
case "S":
break;
case "t":
break;
case "T":
break;
case "U":
break;
case "w":
break;
case "W":
break;
case "Y":
$out_buf .= sprintf("%04d", $year);
break;
case "y":
$out_buf .= substr(sprintf("%04d", $year), 2, 2);
break;
case "z":
break;
case "Z":
break;
default :
$out_buf .= $c;
}
}
return $out_buf;
}
?>
사용법 예제입니다.
[jnils@hosting1 typhoon]$ cat ./test.php
#!/usr/local/bin/php
<?
include \"lib.php\";
echo date(\"YmdHis\", mktime(71, 71, 71, 15, 445, 1999)).\"\\n\";
echo new_date(\"YmdHis\", new_mktime(71, 71, 71, 15, 445, 1999)).\"\\n\";
?>
[jnils@hosting1 typhoon]$ ./test.php
20010522001211
20010522001211
http://www.phpschool.com/bbs2/inc_view.html?id=11707&code=tnt2&start=0&mode=search&field=title&search_name=&operator=and&period=last1year&category_id=&s_que=19
'인터넷관련' 카테고리의 다른 글
Windows XP 블루스크린 오류목록 총정리 (0) | 2008.03.28 |
---|---|
브라우저 오류표시 - 종류와 의미 (0) | 2008.03.28 |
예쁜 스위시 소스모음 (0) | 2008.03.28 |
check_agent - 사용자의 os및 브라우저이름 확인 (0) | 2008.03.28 |
PHP 에서 날짜 함수, 계산하기 (0) | 2008.03.28 |
PC 컴퓨터에서 사용하는 용량과 속도의 단위사 모두 정리 (0) | 2008.03.28 |
ASP DateAdd 함수를 이용한 방법 :: 날짜 함수, 계산하기 (0) | 2008.03.28 |
컨디셔널 커맨트 사용하기 - CSS IE, FF 구분 & JS (0) | 2008.03.28 |