회원 가입시 생년월일 달력이 1970년 이전으로 가니 오류가 발생하네요 > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

회원 가입시 생년월일 달력이 1970년 이전으로 가니 오류가 발생하네요 정보

회원 가입시 생년월일 달력이 1970년 이전으로 가니 오류가 발생하네요

본문

회원 가입시 생년월일 달력이 1970년 이전으로 가니 오류가 발생하네요.
서버는 윈도우XP Pro에 APM으로 돌립니다.

혹시 원인이나 해결 방법을 아시면 도움 부탁드립니다.

오류 내용을 보니 윈도우에서 mktime() 함수와 date() 함수를 지원하지 않는다는데..
php를 전혀 몰라서 어떻게 해야 할 지 모르겠네요...^^

<오류 내용>
Warning: mktime(): Windows does not support negative values for this function in c:\apm\htdocs\gnu4\bbs\calendar.php on line 67

Warning: date(): Windows does not support dates prior to midnight (00:00:00), January 1, 1970 in c:\apm\htdocs\gnu4\bbs\calendar.php on line 68
  • 복사

댓글 전체

전형적인 timestamp의 유효 범위는 1901년 12월 13일 금요일 20:45:54 GMT부터 2038년 1월 19일 화요일 03:14:07 GMT입니다. 이것은 부호 있는 32비트 정수형의 최소와 최대값에 대응합니다. 윈도우즈에서는 이 값은 1970-01-01부터 2038-01-19로 제한됩니다
// 생일입력 받을 수 있는 함수...1970년 이전것도 가능...

function mk_time($m,$d,$y){

  if($y<1970){

    $mk_time=mktime(9,0,0,1,1,1970);

    $i=1969;

      if(checkdate($m,$d,$y)){

          do{
            for($j=12;$j>=1;$j--){
              if($m==$j && $y==$i){
                for($k=31;$k>=$d;$k--){
                  if(checkdate($j,$k,$i)) {
                    $time++;
                  }
                  else
                  {
                    //
                  }
                } //for k
                break;
              }
              else
              {
                for($z=31;$z>=1;$z--){
                  if(checkdate($j,$z,$i)) {
                      $time++;
                  }
                  else
                  {
                    //
                  } //if
                } //for z
              }
          }  //for j

          $i--;

        }while($i>=$y);

        return $mk_time-(($time)*24*3600);//24*3600=1day

      }
      else
      {
        return $mk_time;
      }
  }//if 1970
  else
  {
    return mktime(0,0,0,$m,$d,$y);
  }
}

위 코드를 calendar.php 또는 lin.php 등에 넣으시고
다음 코드를 찾아서...68라인쯤되나요? 흐흐

// 해당월의 1일
$mktime = mktime(0,0,0, $mm,1,$yyyy);
요거를
 $mktime = mk_time($mm,1,$yyyy);  <--mktime() 함수대신 사용자가 만든 mk_time함수로 대체하는거지요
수정합니다.
근데 결정적으로 아래 문장이 걸리네요. date 와 strtotime 함수등도 마찬가지로 1970년에 영향을 받거든요.
그래서 요리조리 고민하다가 걍 제가 주고싶은 값을 주었어요. 어차피 $dt값을 사용하는 부분이 없길래....
어떤 알수없는 문제가 발생할지 모르지만 일단 제대로 실행은 됩니다.

여하튼 아래문장을
$dt = getdate(strtotime(date("Y-m-1", $mktime)));
요렇게 수정합니다.
$dt = '1';

한번해보세요. 회원가입시 생일선택만되면 DB에는 datetime형이 아닌 vaCHAR형에 저장하기 때문에
1970과는 관계가 없습니다.
사실 저도 잘 모르지만 답이 없어서 제가 아는선에서 해결해 보았습니다.
해결사님 정말 감사합니다.^^

아이디처럼 제 문제를 해결해 주셨네요..
혹시 비용 청구를 하시는 건 아니겠죠...ㅎ^^ㅎ

많은 도움 얻고 갑니다.....
2038년 부터는 이런 에러가 나네요

Warning: mktime(): Windows does not support negative values for this function in C:\Inetpub\wwwroot\watchdog\bbs\calendar.php on line 74
2038년 이상 선택에 대해서는 고려하지 않은 코드라서 그렇습니다.
아래 코드로 바꾸어 주시면 됩니다.

function mk_time($m,$d,$y){

  if($y<1970){

    $mk_time=mktime(9,0,0,1,1,1970);

    $i=1969;

      if(checkdate($m,$d,$y)){
          do{
            for($j=12;$j>=1;$j--){
              if($m==$j && $y==$i){
                for($k=31;$k>=$d;$k--){
                  if(checkdate($j,$k,$i)) {
                    $time++;
                  } else { //
                  }
                } //for k
                break;
              } else {
                for($z=31;$z>=1;$z--){
                  if(checkdate($j,$z,$i)) {
                      $time++;
                  } else { //
                  } //if
                } //for z
              }
          }  //for j
          $i--;
        }while($i>=$y);
        return $mk_time-(($time)*24*3600);//24*3600=1day
      } else {
        return $mk_time;
      }
  } elseif($y>2038){

    $mk_time=mktime(9,0,0,1,1,2038);

    $i=2039;

      if(checkdate($m,$d,$y)){
          do{
            for($j=12;$j>=1;$j--){
              if($m==$j && $y==$i){
                for($k=31;$k>=$d;$k--){
                  if(checkdate($j,$k,$i)) {
                    $time++;
                  } else { //
                  }
                } //for k
                break;
              } else {
                for($z=31;$z>=1;$z--){
                  if(checkdate($j,$z,$i)) {
                      $time++;
                  } else { //
                  } //if
                } //for z
              }
          }  //for j
          $i++;
        }while($i>=$y);
        return $mk_time-(($time)*24*3600);//24*3600=1day
      } else {
        return $mk_time;
      }
  } else {//if 2038
    return mktime(0,0,0,$m,$d,$y);
  }
}

아구 추워요~ 감기조심하세요~~~~~~~
© SIRSOFT
현재 페이지 제일 처음으로