개발자는 참 알아야 할 것도 많다... --a

개발한 프로그램에서 날짜를 표시해주거나

조회조건으로 날자를 입력받아야 할 때가 있습니다.

물론 켈린더 콘트롤을 사용해도 무방하지만...

부득이하게 콤보박스나, 텍스트 박스로 입력받아야 하는 경우가

종종 있습니다.

만약 날짜를 택스트 박스로 YYYYMMDD 이런식으로 받았을경우

데이터베이스로 보내기 전에 검증을 거쳐야 할 것입니다..

우리가 쓰는 달력에는 규칙이 있죠.

현대에 전세계에서 공통적으로 사용하는것이

그레고리력이라는건데...

원리는 이렇습니다.

하루는 지구가 자전을하는 주기로 24시간쯤 되고

1년은 지구가 태양의 주위를 공전하는 주기로 약 365일 쯤 되는건 다 아실껍니다.

문제은 이게 딱 떨어지는게 아니고 지구가 태양의 주위를 자전과 공전을 동시에 하기때문에 딱 정수로 떨어지는게 아니라는 점이죠

정확히 말하면 1년은 약 365.2425일쯤 됩니다.

그레고리력에서는 1년을 365일로 표기하고 있는데....

요 남은 0.2425일이 문제입니다.

4년이면 약 하루의 오차가 생기죠.

요걸 2월달에 하루 더 낑겨 넣은게 윤년입니다.

즉 해단년을 4로 나누어 떨어지는 해는 윤년이란 이야기 입니다.

헌데... 의심 많은분들은 벌써 눈치 채셨겠지만....

4년이면 약 하루의 오차...에서 요 약 하루가 문제입니다.

적확히 말하면 1일이 아니기때문에...

이게또 오랜 시간 지나면 쌓여서 오차가 생긴다는 거죠.

해서 4년에 한번씩 1일을 더해주다 100의 배수가 되는 해에는

평년으로 해주고, 다시 400의 배수가 되는 해에는 윤년으로 하기로 한거죠

이게 바로 그레고리력입니다.

그레고리력은 몇가지 단점에도 불구하고

태양회귀년과 3000천년에 하루 정도 오차가 생길정도로 오차가 적다는 장점에서

현재 세계표준력으로 사용하고 있습니다.

물론 앞으로 약 1000년후면 3000년이 되서 하루의 오차가 생기겠지만

그건 어찌할지 나두 모르죠 ㅋㅋ

그래고리력에 알고리즘에 기반 윤년 체크

function getLastDay(solar_date)
{
var MonthTable = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if (((solar_date.getYear() % 4 == 0) && (solar_date.getYear() % 100 != 0)) || (solar_date.getYear()% 400 == 0))
MonthTable[1] = 29;
else
MonthTable[1] = 28;
return MonthTable[solar_date.getMonth()];
}

//사용법
// 예로 2004년 2월의 마지막 날이 몇일인지 알고 싶으면

var nowDate = new Date();

nowDate.setYear( 2000);
nowDate.setMonth(2-1); // 월은 0=1월, 1=2월... 11=12월

nowDate.date= getLastDay(nowDate);

/*******************************************************/
/* 숫자 데이터중에서 Comma(,) 를 전부 없애는 함수 */
/*******************************************************/
function removeComma(obj)
{
var src = new String(obj.value);
var rtn_value = "";
for (var i=0; i<src.length; i++)
{
var ch = src.charAt(i);
if( (ch >= "0" && "9" >= ch) || ch == "-" || ch == ".")
rtn_value = rtn_value + ch;
}
if( rtn_value.length = 0)
rtn_value = 0;
return rtn_value;
}

/*********************************************************/
/* 소수점 자리가 있는 숫자 중에서 Comma(,)를 붙이는 함수 */
/*********************************************************/
function setComma(s)
{
for(j=0; j<s.length; j++)
s= s.replace(/,/g,"");
var t="";
var i;
var j=0;
var tLen =s.length;

if (s.length <= 3 )
{
return s;
}

for(i=0;i<tLen;i++)
{
if (i!=0 && ( i % 3 == tLen % 3) ) t += ",";
if(i < s.length ) t += s.charAt(i);
}
return t;
}

웹개발시 입력값의 길이를 체크할때

string.length 를 이용하면 무조건 한글이건 영문이건

1글자로 체크함.

서버측에서 실제 저장할때는 알파뉴메릭(숫자, 영문자, 아스키코드 등)은 1byte, 한글 및 특수문자는 2byte로 처리함으로

한글이 포함된경우 폼에서 자바스크립트로 체크하더라도

데이터베이스에 저장할때 에러가 나죠

한글,특수문자를 2자리로 계산해서 폼에서 체크하도록 한

예제입니다.


<html>
<head>
<title> new document </title>
</head>
<script language="JavaScript">
<!--
function check()
{
var string = document.a.test.value;
alert(getStringLength(string));
}

// 문자열 길이 체크 알파뉴메릭(1자리), 한글(2자리)
function getStringLength (str)
{
var retCode = 0;
var strLength = 0;

for (i = 0; i < str.length; i++)
{
var code = str.charCodeAt(i)
var ch = str.substr(i,1).toUpperCase()

code = parseInt(code)

if ((ch < "0" || ch > "9") && (ch < "A" || ch > "Z") && ((code > 255) || (code < 0)))
strLength = strLength + 2;
else
strLength = strLength + 1;
}
return strLength;
}
//-->
</script>
</head>
<body>
<form name="a">
<input type="text" name="test"><input type="button" value="체크" onClick="JavaScript:check();">
</form>
</body>
</html>



// 숫자 체크
function CheckNum(tocheck)
{
var isnum = true;

if (tocheck == null || tocheck == "")
{
isnum = false;
return isnum;
}

for (var j = 0 ; j < tocheck.length; j++)
{
if (tocheck.substring(j, j + 1) != "0" &&
tocheck.substring(j, j + 1) != "1" &&
tocheck.substring(j, j + 1) != "2" &&
tocheck.substring(j, j + 1) != "3" &&
tocheck.substring(j, j + 1) != "4" &&
tocheck.substring(j, j + 1) != "5" &&
tocheck.substring(j, j + 1) != "6" &&
tocheck.substring(j, j + 1) != "7" &&
tocheck.substring(j, j + 1) != "8" &&
tocheck.substring(j, j + 1) != "9")
{
isnum = false;
}
}
return isnum;
}

+ Recent posts