인터넷정보

1970년 이전 날짜 사용가능한 date, mktime

알 수 없는 사용자 2007. 11. 19. 14:33
1970년 이전 날짜에대해서는 date와 mktime 으로 값을 구할수가 없기에 찾아봤더니..1902년 부터인가를 구하는 프로그램이 있더군요..
그래서 그냥 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
반응형