2013년 12월 22일 일요일

C++ 날짜 검증 및 특정 포맷으로 반환




EditBox로 날짜를 입력받아야 하는 경우 입력 받은 날짜를 검증하고 특정 포맷으로 변경하는 용도
  1. /************************************************************************
  2. * 입력된 date를 받아서
  3. * yyyyMMdd, yyyyMdd, yyyyMMd, yyyyMd 포맷으로 입력되었다는 가정하에
  4. * 년/월/일을 검증하여
  5. * yyyy-mm-dd형식으로 반환
  6. ************************************************************************/
  7. const char* getDate(string date)
  8. {
  9. // bool result = true;
  10. int length = date.size(); // 입력된 날짜의 문자열 길이
  11. string iy = date.substr(0, 4); // 년도 문자열을 추출
  12. string im; // 월 문자열 저장 변수
  13. string id; // 일 문자열 저장 변수
  14. //////////////////////////////////////////////////////////////////////
  15. // YYYYMD로 입력 되었을 경우의 월/일 문자열
  16. //////////////////////////////////////////////////////////////////////
  17. if (length == 6)
  18. {
  19. im = date.substr(4, 1);
  20. id = date.substr(5, 1);
  21. }
  22. //////////////////////////////////////////////////////////////////////
  23. // YYYYMMD || YYYYMDD로 입력 되었을 경우의 월/일 문자열
  24. //////////////////////////////////////////////////////////////////////
  25. else if (length == 7)
  26. {
  27. im = date.substr(4, 2);
  28. id = date.substr(6, 1);
  29. // 만약 추출한 월 데이터가 12보다 크면
  30. // 월 데이터를 앞자리만 사용하고
  31. // 뒤 자리수는 일 데이터 앞자리로 옮김
  32. if (atoi(im.c_str()) > 12)
  33. {
  34. im = date.substr(4, 1);
  35. id = date.substr(5, 2);
  36. }
  37. }
  38. //////////////////////////////////////////////////////////////////////
  39. // YYYYMMDD로 입력 되었을 경우의 월/일 문자열
  40. //////////////////////////////////////////////////////////////////////
  41. else if (length == 8)
  42. {
  43. im = date.substr(4, 2);
  44. id = date.substr(6, 2);
  45. }
  46. //////////////////////////////////////////////////////////////////////
  47. // YYYY-MM-DD로 입력 되었을 경우의 월/일 문자열
  48. //////////////////////////////////////////////////////////////////////
  49. else if (length == 10)
  50. {
  51. im = date.substr(5, 2);
  52. id = date.substr(8, 2);
  53. }
  54. int iYear = checkYear(iy); // 년도를 검증
  55. int iMonth = checkMonth(im); // 월 검증
  56. int iDay = checkDay(id); // 일 검증
  57.  
  58. string m = (iMonth < 10) ? "0" + Common::itos(iMonth) : Common::itos(iMonth); // 월 문자열 생성
  59. string d = (iDay < 10) ? "0" + Common::itos(iDay) : Common::itos(iDay); // 일 문자열 생성
  60. string dateStr = Common::itos(iYear) + "-" + m + "-" + d;
  61. return dateStr.c_str();
  62. }
  63.  
년/월/일 검증 함수
  1. // 출생년도를 130년전 부터 현재까지로 한정함
  2. int MemberLayer::checkYear(std::string date)
  3. {
  4. int n = atoi(date.c_str());
  5. if (n < year - 130) n = year - 130;
  6. else if (n > year) n = year;
  7. return n;
  8. }
  9.  
  10. // 입력한 월이 1~12사이의 숫자여야 하고 현재보다 이전이여야 함
  11. int MemberLayer::checkMonth(std::string date)
  12. {
  13. int n = atoi(date.c_str());
  14. // "03"일 경우 0을 반환함으로 1의자리 수로 한번 확인
  15. if (n == 0) n = atoi(date.substr(1).c_str());
  16. if (n < 1) n = 1;
  17. else if (iYear == year) // 입력한 년도가 현재 년도이면
  18. {
  19. if (n > month) n = month;
  20. }
  21. else
  22. {
  23. if (n > 12) n = 12;
  24. }
  25. return n;
  26. }
  27.  
  28. // 윷년일 때 2월 날짜와 큰달과 작은달의 입력가능 날짜 제한
  29. int MemberLayer::checkDay(std::string date)
  30. {
  31. int n = atoi(date.c_str());
  32. if (n == 0) n = atoi(date.substr(1).c_str());
  33. // 입력한 생년월일이 오늘 이전이어야 함으로 년, 월이 같을 경우
  34. // 입력한 일이 오늘보다 크면 어제 날짜로 변경
  35. if (n < 1) n = 1;
  36. else if (iYear == year && iMonth == month)
  37. {
  38. if ( n >= day) n = day - 1;
  39. }
  40. else
  41. {
  42. if (iMonth == 2)
  43. {
  44. // 입력한 월이 2월일 경우
  45. // 입력 가능 한 계 날짜의 기본값을 28일로 하고
  46. // 윷년일 경우 29일로 설정
  47. int max = 28;
  48. if ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 100 == 0 && iYear % 400 == 0))
  49. {
  50. max = 29;
  51. }
  52. if (n > max) n = max;
  53. }
  54. else if (iMonth == 4 || iMonth == 6 || iMonth == 9 || iMonth == 11)
  55. {
  56. if (n > 30) n = 30;
  57. }
  58. else
  59. {
  60. if (n > 31) n = 31;
  61. }
  62. }
  63. return n;
  64. }

댓글 없음:

댓글 쓰기