개발자

음력 변환 프로그램 자바(Java) 소스

쿠카곰돌이 2020. 9. 29. 00:53
반응형

  * 일자 : String 타입의 날짜 (예, 20090501)
  * 시간 : String 타입의 시간 (예, 2035)
  * 연 : int 타입의 연 (예, 1)
  * 월 : int 타입의 월 (예, 2)
  * 일 : int 타입의 일 (예, 10)
  * 시 : int 타입의 시 (예, 5)
  * 분 : int 타입의 분 (예, 30)
  * 포멧스트링 : String 타입의 Date 포멧스트링 (예, yyyy년 MM월 dd일 HH시 mm분 ss초)
  * Validation 체크: [[egovframework:요소기술_validation_체크]]
== Output ==
  * String

 

String sDate   = "20080820";
int     sDay    = Integer.parseInt(request.getParameter("sDay"));
String resDate  = EgovDateUtil.addYMDtoDayTime(sDate, "0000", 0, 0, sDay, 0, 0, "yyyyMMdd");

...
String sDate   = "20080820";
String sTime   = "2030";
int     sHour   = 2;
String resDate  = EgovDateUtil.addYMDtoDayTime(sDate, sTime, 0, 0, 0, sHour, 0, "yyyyMMddHHmm");

...
String sDate   = "20080820";
int     sYear   = 1;
int     sMonth  = 0;
int     sDay    = 5;
String resDate  = EgovDateUtil.addYMDtoWeek(sDate, sYear, sMonth, sDay);

 

 

package egovframework.com.utl.fcc.service;
 
import java.security.SecureRandom;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.TimeZone;
 
import com.ibm.icu.util.ChineseCalendar;
 
/**
*
* Date 에 대한 Util 클래스
* @author 공통서비스 개발팀 이중호
* @since 2009.02.01
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2009.02.01 이중호 최초 생성
*
* </pre>
*/
public class EgovDateUtil {
 
/**
* <p>yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 년, 월, 일을
* 증감한다. 년, 월, 일은 가감할 수를 의미하며, 음수를 입력할 경우 감한다.</p>
*
* <pre>
* DateUtil.addYearMonthDay("19810828", 0, 0, 19) = "19810916"
* DateUtil.addYearMonthDay("20060228", 0, 0, -10) = "20060218"
* DateUtil.addYearMonthDay("20060228", 0, 0, 10) = "20060310"
* DateUtil.addYearMonthDay("20060228", 0, 0, 32) = "20060401"
* DateUtil.addYearMonthDay("20050331", 0, -1, 0) = "20050228"
* DateUtil.addYearMonthDay("20050301", 0, 2, 30) = "20050531"
* DateUtil.addYearMonthDay("20050301", 1, 2, 30) = "20060531"
* DateUtil.addYearMonthDay("20040301", 2, 0, 0) = "20060301"
* DateUtil.addYearMonthDay("20040229", 2, 0, 0) = "20060228"
* DateUtil.addYearMonthDay("20040229", 2, 0, 1) = "20060301"
* </pre>
*
* @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식)
* @param year 가감할 년. 0이 입력될 경우 가감이 없다
* @param month 가감할 월. 0이 입력될 경우 가감이 없다
* @param day 가감할 일. 0이 입력될 경우 가감이 없다
* @return yyyyMMdd 형식의 날짜 문자열
* @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우.
* 입력 값이 <code>null</code>인 경우.
*/
public static String addYearMonthDay(String sDate, int year, int month, int day) {
 
String dateStr = validChkDate(sDate);
 
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
try {
cal.setTime(sdf.parse(dateStr));
} catch (ParseException e) {
throw new IllegalArgumentException("Invalid date format: " + dateStr);
}
 
if (year != 0)
cal.add(Calendar.YEAR, year);
if (month != 0)
cal.add(Calendar.MONTH, month);
if (day != 0)
cal.add(Calendar.DATE, day);
return sdf.format(cal.getTime());
}
 
/**
* <p>yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 년을
* 증감한다. <code>year</code>는 가감할 수를 의미하며, 음수를 입력할 경우 감한다.</p>
*
* <pre>
* DateUtil.addYear("20000201", 62) = "20620201"
* DateUtil.addYear("20620201", -62) = "20000201"
* DateUtil.addYear("20040229", 2) = "20060228"
* DateUtil.addYear("20060228", -2) = "20040228"
* DateUtil.addYear("19000101", 200) = "21000101"
* </pre>
*
* @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식)
* @param year 가감할 년. 0이 입력될 경우 가감이 없다
* @return yyyyMMdd 형식의 날짜 문자열
* @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우.
* 입력 값이 <code>null</code>인 경우.
*/
public static String addYear(String dateStr, int year) {
return addYearMonthDay(dateStr, year, 0, 0);
}
 
/**
* <p>yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 월을
* 증감한다. <code>month</code>는 가감할 수를 의미하며, 음수를 입력할 경우 감한다.</p>
*
* <pre>
* DateUtil.addMonth("20010201", 12) = "20020201"
* DateUtil.addMonth("19800229", 12) = "19810228"
* DateUtil.addMonth("20040229", 12) = "20050228"
* DateUtil.addMonth("20050228", -12) = "20040228"
* DateUtil.addMonth("20060131", 1) = "20060228"
* DateUtil.addMonth("20060228", -1) = "20060128"
* </pre>
*
* @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식)
* @param month 가감할 월. 0이 입력될 경우 가감이 없다
* @return yyyyMMdd 형식의 날짜 문자열
* @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우.
* 입력 값이 <code>null</code>인 경우.
*/
public static String addMonth(String dateStr, int month) {
return addYearMonthDay(dateStr, 0, month, 0);
}
 
/**
* <p>yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 일(day)를
* 증감한다. <code>day</code>는 가감할 수를 의미하며, 음수를 입력할 경우 감한다.
* <br/><br/>
* 위에 정의된 addDays 메서드는 사용자가 ParseException을 반드시 처리해야 하는 불편함이
* 있기 때문에 추가된 메서드이다.</p>
*
* <pre>
* DateUtil.addDay("19991201", 62) = "20000201"
* DateUtil.addDay("20000201", -62) = "19991201"
* DateUtil.addDay("20050831", 3) = "20050903"
* DateUtil.addDay("20050831", 3) = "20050903"
* // 2006년 6월 31일은 실제로 존재하지 않는 날짜이다 -> 20060701로 간주된다
* DateUtil.addDay("20060631", 1) = "20060702"
* </pre>
*
* @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식)
* @param day 가감할 일. 0이 입력될 경우 가감이 없다
* @return yyyyMMdd 형식의 날짜 문자열
* @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우.
* 입력 값이 <code>null</code>인 경우.
*/
public static String addDay(String dateStr, int day) {
return addYearMonthDay(dateStr, 0, 0, day);
}
 
/**
* <p>yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열 <code>dateStr1</code>과 <code>
* dateStr2</code> 사이의 일 수를 구한다.<br>
* <code>dateStr2</code>가 <code>dateStr1</code> 보다 과거 날짜일 경우에는
* 음수를 반환한다. 동일한 경우에는 0을 반환한다.</p>
*
* <pre>
* DateUtil.getDaysDiff("20060228","20060310") = 10
* DateUtil.getDaysDiff("20060101","20070101") = 365
* DateUtil.getDaysDiff("19990228","19990131") = -28
* DateUtil.getDaysDiff("20060801","20060802") = 1
* DateUtil.getDaysDiff("20060801","20060801") = 0
* </pre>
*
* @param dateStr1 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식)
* @param dateStr2 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식)
* @return 일 수 차이.
* @throws IllegalArgumentException 날짜 포맷이 정해진 바와 다를 경우.
* 입력 값이 <code>null</code>인 경우.
*/
public static int getDaysDiff(String sDate1, String sDate2) {
String dateStr1 = validChkDate(sDate1);
String dateStr2 = validChkDate(sDate2);
 
if (!checkDate(sDate1) || !checkDate(sDate2)) {
throw new IllegalArgumentException("Invalid date format: args[0]=" + sDate1 + " args[1]=" + sDate2);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
 
Date date1 = null;
Date date2 = null;
try {
date1 = sdf.parse(dateStr1);
date2 = sdf.parse(dateStr2);
} catch (ParseException e) {
throw new IllegalArgumentException("Invalid date format: args[0]=" + dateStr1 + " args[1]=" + dateStr2);
}
// 2011.10.21 보안점검 후속조치
if (date1 != null && date2 != null) {
int days1 = (int)((date1.getTime()/3600000)/24);
int days2 = (int)((date2.getTime()/3600000)/24);
return days2 - days1;
} else {
return 0;
}
 
 
}
 
/**
* <p>yyyyMMdd 혹은 yyyy-MM-dd 형식의 날짜 문자열을 입력 받아 유효한 날짜인지 검사.</p>
*
* <pre>
* DateUtil.checkDate("1999-02-35") = false
* DateUtil.checkDate("2000-13-31") = false
* DateUtil.checkDate("2006-11-31") = false
* DateUtil.checkDate("2006-2-28") = false
* DateUtil.checkDate("2006-2-8") = false
* DateUtil.checkDate("20060228") = true
* DateUtil.checkDate("2006-02-28") = true
* </pre>
*
* @param dateStr 날짜 문자열(yyyyMMdd, yyyy-MM-dd의 형식)
* @return 유효한 날짜인지 여부
*/
public static boolean checkDate(String sDate) {
String dateStr = validChkDate(sDate);
 
String year = dateStr.substring(0,4);
String month = dateStr.substring(4,6);
String day = dateStr.substring(6);
 
return checkDate(year, month, day);
}
 
/**
* <p>입력한 년, 월, 일이 유효한지 검사.</p>
*
* @param year 연도
* @param month 월
* @param day 일
* @return 유효한 날짜인지 여부
*/
public static boolean checkDate(String year, String month, String day) {
try {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd", Locale.getDefault());
 
Date result = formatter.parse(year + "." + month + "." + day);
String resultStr = formatter.format(result);
if (resultStr.equalsIgnoreCase(year + "." + month + "." + day))
return true;
else
return false;
} catch (Exception e) {
return false;
}
}
 
/**
* 날짜형태의 String의 날짜 포맷 및 TimeZone을 변경해 주는 메서드
*
* @param strSource 바꿀 날짜 String
* @param fromDateFormat 기존의 날짜 형태
* @param toDateFormat 원하는 날짜 형태
* @param strTimeZone 변경할 TimeZone(""이면 변경 안함)
* @return 소스 String의 날짜 포맷을 변경한 String
*/
public static String convertDate(String strSource, String fromDateFormat,
String toDateFormat, String strTimeZone) {
SimpleDateFormat simpledateformat = null;
Date date = null;
String _fromDateFormat = "";
String _toDateFormat = "";
 
if(EgovStringUtil.isNullToString(strSource).trim().equals("")) {
return "";
}
if(EgovStringUtil.isNullToString(fromDateFormat).trim().equals(""))
_fromDateFormat = "yyyyMMddHHmmss"; // default값
if(EgovStringUtil.isNullToString(toDateFormat).trim().equals(""))
_toDateFormat = "yyyy-MM-dd HH:mm:ss"; // default값
 
try {
simpledateformat = new SimpleDateFormat(_fromDateFormat, Locale.getDefault());
date = simpledateformat.parse(strSource);
if (!EgovStringUtil.isNullToString(strTimeZone).trim().equals("")) {
simpledateformat.setTimeZone(TimeZone.getTimeZone(strTimeZone));
}
simpledateformat = new SimpleDateFormat(_toDateFormat, Locale.getDefault());
}
catch(Exception exception) {
//exception.printStackTrace();
throw new RuntimeException(exception); // 2011.10.10 보안점검 후속조치
}
return simpledateformat.format(date);
 
}
 
 
/**
* yyyyMMdd 형식의 날짜문자열을 원하는 캐릭터(ch)로 쪼개 돌려준다<br/>
* <pre>
* ex) 20030405, ch(.) -> 2003.04.05
* ex) 200304, ch(.) -> 2003.04
* ex) 20040101,ch(/) --> 2004/01/01 로 리턴
* </pre>
*
* @param date yyyyMMdd 형식의 날짜문자열
* @param ch 구분자
* @return 변환된 문자열
*/
public static String formatDate(String sDate, String ch) {
String dateStr = validChkDate(sDate);
 
String str = dateStr.trim();
String yyyy = "";
String mm = "";
String dd = "";
 
if (str.length() == 8) {
yyyy = str.substring(0, 4);
if (yyyy.equals("0000"))
return "";
 
mm = str.substring(4, 6);
if (mm.equals("00"))
return yyyy;
 
dd = str.substring(6, 8);
if (dd.equals("00"))
return yyyy + ch + mm;
 
return yyyy + ch + mm + ch + dd;
} else if (str.length() == 6) {
yyyy = str.substring(0, 4);
if (yyyy.equals("0000"))
return "";
 
mm = str.substring(4, 6);
if (mm.equals("00"))
return yyyy;
 
return yyyy + ch + mm;
} else if (str.length() == 4) {
yyyy = str.substring(0, 4);
if (yyyy.equals("0000"))
return "";
else
return yyyy;
} else
return "";
}
 
/**
* HH24MISS 형식의 시간문자열을 원하는 캐릭터(ch)로 쪼개 돌려준다 <br>
* <pre>
* ex) 151241, ch(/) -> 15/12/31
* </pre>
*
* @param str HH24MISS 형식의 시간문자열
* @param ch 구분자
* @return 변환된 문자열
*/
public static String formatTime(String sTime, String ch) {
String timeStr = validChkTime(sTime);
return timeStr.substring(0, 2) + ch + timeStr.substring(2, 4) + ch + timeStr.substring(4, 6);
}
 
/**
* 연도를 입력 받아 해당 연도 2월의 말일(일수)를 문자열로 반환한다.
*
* @param year
* @return 해당 연도 2월의 말일(일수)
*/
public String leapYear(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return "29";
}
 
return "28";
}
 
/**
* <p>입력받은 연도가 윤년인지 아닌지 검사한다.</p>
*
* <pre>
* DateUtil.isLeapYear(2004) = false
* DateUtil.isLeapYear(2005) = true
* DateUtil.isLeapYear(2006) = true
* </pre>
*
* @param year 연도
* @return 윤년 여부
*/
public static boolean isLeapYear(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return false;
}
return true;
}
 
 
/**
* 현재(한국기준) 날짜정보를 얻는다. <BR>
* 표기법은 yyyy-mm-dd <BR>
* @return String yyyymmdd형태의 현재 한국시간. <BR>
*/
public static String getToday(){
return getCurrentDate("");
}
 
/**
* 현재(한국기준) 날짜정보를 얻는다. <BR>
* 표기법은 yyyy-mm-dd <BR>
* @return String yyyymmdd형태의 현재 한국시간. <BR>
*/
public static String getCurrentDate(String dateType) {
Calendar aCalendar = Calendar.getInstance();
 
int year = aCalendar.get(Calendar.YEAR);
int month = aCalendar.get(Calendar.MONTH) + 1;
int date = aCalendar.get(Calendar.DATE);
String strDate = Integer.toString(year) +
((month<10) ? "0" + Integer.toString(month) : Integer.toString(month)) +
((date<10) ? "0" + Integer.toString(date) : Integer.toString(date));
 
if(!"".equals(dateType)) strDate = convertDate(strDate, "yyyyMMdd", dateType);
 
return strDate;
}
 
/**
* 날짜형태의 String의 날짜 포맷만을 변경해 주는 메서드
* @param sDate 날짜
* @param sTime 시간
* @param sFormatStr 포멧 스트링 문자열
* @return 지정한 날짜/시간을 지정한 포맷으로 출력
* @See Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
M Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
 
 
 
Date and Time Pattern Result
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
 
*/
public static String convertDate(String sDate, String sTime, String sFormatStr) {
String dateStr = validChkDate(sDate);
String timeStr = validChkTime(sTime);
 
Calendar cal = null;
cal = Calendar.getInstance() ;
 
cal.set(Calendar.YEAR , Integer.parseInt(dateStr.substring(0,4)));
cal.set(Calendar.MONTH , Integer.parseInt(dateStr.substring(4,6))-1 );
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6,8)));
cal.set(Calendar.HOUR_OF_DAY , Integer.parseInt(timeStr.substring(0,2)));
cal.set(Calendar.MINUTE , Integer.parseInt(timeStr.substring(2,4)));
 
SimpleDateFormat sdf = new SimpleDateFormat(sFormatStr,Locale.ENGLISH);
 
return sdf.format(cal.getTime());
}
 
/**
* 입력받은 일자 사이의 임의의 일자를 반환
* @param sDate1 시작일자
* @param sDate2 종료일자
* @return 임의일자
*/
public static String getRandomDate(String sDate1, String sDate2) {
String dateStr1 = validChkDate(sDate1);
String dateStr2 = validChkDate(sDate2);
 
String randomDate = null;
 
int sYear, sMonth, sDay;
int eYear, eMonth, eDay;
 
sYear = Integer.parseInt(dateStr1.substring(0, 4));
sMonth = Integer.parseInt(dateStr1.substring(4, 6));
sDay = Integer.parseInt(dateStr1.substring(6, 8));
 
eYear = Integer.parseInt(dateStr2.substring(0, 4));
eMonth = Integer.parseInt(dateStr2.substring(4, 6));
eDay = Integer.parseInt(dateStr2.substring(6, 8));
 
GregorianCalendar beginDate = new GregorianCalendar(sYear, sMonth-1, sDay, 0, 0);
GregorianCalendar endDate = new GregorianCalendar(eYear, eMonth-1, eDay, 23,59);
 
if (endDate.getTimeInMillis() < beginDate.getTimeInMillis()) {
throw new IllegalArgumentException("Invalid input date : " + sDate1 + "~" + sDate2);
}
 
SecureRandom r = new SecureRandom();
 
r.setSeed(new Date().getTime()); // 2010.10.10 보안점검 후속조치
 
long rand = ((r.nextLong()>>>1)%( endDate.getTimeInMillis()-beginDate.getTimeInMillis() + 1)) + beginDate.getTimeInMillis();
 
GregorianCalendar cal = new GregorianCalendar();
//SimpleDateFormat calformat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat calformat = new SimpleDateFormat("yyyyMMdd",Locale.ENGLISH);
cal.setTimeInMillis(rand);
randomDate = calformat.format(cal.getTime());
 
// 랜덤문자열를 리턴
return randomDate;
}
 
/**
* 입력받은 양력일자를 변환하여 음력일자로 반환
* @param sDate 양력일자
* @return 음력일자
*/
public static HashMap toLunar(String sDate) {
String dateStr = validChkDate(sDate);
 
HashMap hm = new HashMap();
hm.put("day", "");
hm.put("leap", 0);
 
if(dateStr.length() != 8) {
return hm;
}
 
Calendar cal ;
ChineseCalendar lcal ;
 
cal = Calendar.getInstance() ;
lcal = new ChineseCalendar();
 
cal.set(Calendar.YEAR , Integer.parseInt(dateStr.substring(0,4)));
cal.set(Calendar.MONTH , Integer.parseInt(dateStr.substring(4,6))-1 );
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6,8)));
 
lcal.setTimeInMillis(cal.getTimeInMillis());
 
String year = String.valueOf(lcal.get(ChineseCalendar.EXTENDED_YEAR) - 2637);
String month = String.valueOf(lcal.get(ChineseCalendar.MONTH ) + 1 );
String day = String.valueOf(lcal.get(ChineseCalendar.DAY_OF_MONTH ) );
String leap = String.valueOf(lcal.get(ChineseCalendar.IS_LEAP_MONTH) );
 
String pad4Str = "0000";
String pad2Str = "00";
 
String retYear = (pad4Str + year ) .substring(year .length());
String retMonth = (pad2Str + month) .substring(month.length());
String retDay = (pad2Str + day ) .substring(day .length());
 
String SDay = retYear+retMonth+retDay;
 
hm.put("day", SDay);
hm.put("leap", leap);
 
return hm;
}
 
/**
* 입력받은 음력일자를 변환하여 양력일자로 반환
* @param sDate 음력일자
* @param iLeapMonth 음력윤달여부(IS_LEAP_MONTH)
* @return 양력일자
*/
public static String toSolar(String sDate, int iLeapMonth) {
String dateStr = validChkDate(sDate);
 
Calendar cal ;
ChineseCalendar lcal ;
 
cal = Calendar.getInstance() ;
lcal = new ChineseCalendar();
 
 
lcal.set(ChineseCalendar.EXTENDED_YEAR, Integer.parseInt(dateStr.substring(0,4)) + 2637);
lcal.set(ChineseCalendar.MONTH , Integer.parseInt(dateStr.substring(4,6)) - 1);
lcal.set(ChineseCalendar.DAY_OF_MONTH , Integer.parseInt(dateStr.substring(6,8)));
lcal.set(ChineseCalendar.IS_LEAP_MONTH, iLeapMonth);
 
cal.setTimeInMillis(lcal.getTimeInMillis());
 
String year = String.valueOf(cal.get(Calendar.YEAR ) );
String month = String.valueOf(cal.get(Calendar.MONTH ) + 1);
String day = String.valueOf(cal.get(Calendar.DAY_OF_MONTH) );
 
String pad4Str = "0000";
String pad2Str = "00";
 
String retYear = (pad4Str + year ).substring(year .length());
String retMonth = (pad2Str + month).substring(month.length());
String retDay = (pad2Str + day ).substring(day .length());
 
return retYear+retMonth+retDay;
}
 
 
/**
* 입력받은 요일의 영문명을 국문명의 요일로 반환
* @param sWeek 영문 요일명
* @return 국문 요일명
*/
public static String convertWeek(String sWeek) {
String retStr = null;
 
if (sWeek.equals("SUN") ) { retStr = "일요일";
} else if (sWeek.equals("MON") ) { retStr = "월요일";
} else if (sWeek.equals("TUE") ) { retStr = "화요일";
} else if (sWeek.equals("WED") ) { retStr = "수요일";
} else if (sWeek.equals("THR") ) { retStr = "목요일";
} else if (sWeek.equals("FRI") ) { retStr = "금요일";
} else if (sWeek.equals("SAT") ) { retStr = "토요일";
}
 
return retStr;
}
 
/**
* 입력일자의 유효 여부를 확인
* @param sDate 일자
* @return 유효 여부
*/
public static boolean validDate(String sDate) {
String dateStr = validChkDate(sDate);
 
Calendar cal ;
boolean ret = false;
 
cal = Calendar.getInstance() ;
 
cal.set(Calendar.YEAR , Integer.parseInt(dateStr.substring(0,4)));
cal.set(Calendar.MONTH , Integer.parseInt(dateStr.substring(4,6))-1 );
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6,8)));
 
String year = String.valueOf(cal.get(Calendar.YEAR ) );
String month = String.valueOf(cal.get(Calendar.MONTH ) + 1);
String day = String.valueOf(cal.get(Calendar.DAY_OF_MONTH) );
 
String pad4Str = "0000";
String pad2Str = "00";
 
String retYear = (pad4Str + year ).substring(year .length());
String retMonth = (pad2Str + month).substring(month.length());
String retDay = (pad2Str + day ).substring(day .length());
 
String retYMD = retYear+retMonth+retDay;
 
if(sDate.equals(retYMD)) {
ret = true;
}
 
return ret;
}
 
/**
* 입력일자, 요일의 유효 여부를 확인
* @param sDate 일자
* @param sWeek 요일 (DAY_OF_WEEK)
* @return 유효 여부
*/
public static boolean validDate(String sDate, int sWeek) {
String dateStr = validChkDate(sDate);
 
Calendar cal ;
boolean ret = false;
 
cal = Calendar.getInstance() ;
 
cal.set(Calendar.YEAR , Integer.parseInt(dateStr.substring(0,4)));
cal.set(Calendar.MONTH , Integer.parseInt(dateStr.substring(4,6))-1 );
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr.substring(6,8)));
 
int Week = cal.get(Calendar.DAY_OF_WEEK );
 
if (validDate(sDate)) {
if (sWeek == Week) {
ret = true;
}
}
 
return ret;
}
 
/**
* 입력시간의 유효 여부를 확인
* @param sTime 입력시간
* @return 유효 여부
*/
public static boolean validTime(String sTime) {
String timeStr = validChkTime(sTime);
 
Calendar cal ;
boolean ret = false;
 
cal = Calendar.getInstance() ;
 
cal.set(Calendar.HOUR_OF_DAY , Integer.parseInt(timeStr.substring(0,2)));
cal.set(Calendar.MINUTE , Integer.parseInt(timeStr.substring(2,4)));
 
String HH = String.valueOf(cal.get(Calendar.HOUR_OF_DAY ));
String MM = String.valueOf(cal.get(Calendar.MINUTE ));
 
String pad2Str = "00";
 
String retHH = (pad2Str + HH).substring(HH.length());
String retMM = (pad2Str + MM).substring(MM.length());
 
String retTime = retHH + retMM;
 
if(sTime.equals(retTime)) {
ret = true;
}
 
return ret;
}
 
/**
* 입력된 일자에 연, 월, 일을 가감한 날짜의 요일을 반환
* @param sDate 날짜
* @param year 연
* @param month 월
* @param day 일
* @return 계산된 일자의 요일(DAY_OF_WEEK)
*/
public static String addYMDtoWeek(String sDate, int year, int month, int day) {
String dateStr = validChkDate(sDate);
 
dateStr = addYearMonthDay(dateStr, year, month, day);
 
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd",Locale.ENGLISH);
try {
cal.setTime(sdf.parse(dateStr));
} catch (ParseException e) {
throw new IllegalArgumentException("Invalid date format: " + dateStr);
}
 
SimpleDateFormat rsdf = new SimpleDateFormat("E",Locale.ENGLISH);
 
return rsdf.format(cal.getTime());
}
 
/**
* 입력된 일자에 연, 월, 일, 시간, 분을 가감한 날짜, 시간을 포멧스트링 형식으로 반환
* @param sDate 날짜
* @param sTime 시간
* @param year 연
* @param month 월
* @param day 일
* @param hour 시간
* @param minute 분
* @param formatStr 포멧스트링
* @return
*/
public static String addYMDtoDayTime(String sDate, String sTime, int year, int month, int day, int hour, int minute, String formatStr) {
String dateStr = validChkDate(sDate);
String timeStr = validChkTime(sTime);
 
dateStr = addYearMonthDay(dateStr, year, month, day);
 
dateStr = convertDate(dateStr, timeStr, "yyyyMMddHHmm");
 
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm",Locale.ENGLISH);
 
try {
cal.setTime(sdf.parse(dateStr));
} catch (ParseException e) {
throw new IllegalArgumentException("Invalid date format: " + dateStr);
}
 
if (hour != 0) {
cal.add(Calendar.HOUR, hour);
}
 
if (minute != 0) {
cal.add(Calendar.MINUTE, minute);
}
 
SimpleDateFormat rsdf = new SimpleDateFormat(formatStr,Locale.ENGLISH);
 
return rsdf.format(cal.getTime());
}
 
/**
* 입력된 일자를 int 형으로 반환
* @param sDate 일자
* @return int(일자)
*/
public static int datetoInt(String sDate) {
return Integer.parseInt(convertDate(sDate, "0000", "yyyyMMdd"));
}
 
/**
* 입력된 시간을 int 형으로 반환
* @param sTime 시간
* @return int(시간)
*/
public static int timetoInt(String sTime) {
return Integer.parseInt(convertDate("00000101", sTime, "HHmm"));
}
 
/**
* 입력된 일자 문자열을 확인하고 8자리로 리턴
* @param sDate
* @return
*/
public static String validChkDate(String dateStr) {
String _dateStr = dateStr;
 
if (dateStr == null || !(dateStr.trim().length() == 8 || dateStr.trim().length() == 10)) {
throw new IllegalArgumentException("Invalid date format: " + dateStr);
}
if (dateStr.length() == 10) {
_dateStr = EgovStringUtil.removeMinusChar(dateStr);
}
return _dateStr;
}
 
/**
* 입력된 일자 문자열을 확인하고 8자리로 리턴
* @param sDate
* @return
*/
public static String validChkTime(String timeStr) {
String _timeStr = timeStr;
 
if (_timeStr.length() == 5) {
_timeStr = EgovStringUtil.remove(_timeStr,':');
}
if (_timeStr == null || !(_timeStr.trim().length() == 4)) {
throw new IllegalArgumentException("Invalid time format: " + _timeStr);
}
 
return _timeStr;
}
 
 
}
반응형

'개발자' 카테고리의 다른 글

DB2 cusror사용  (0) 2020.12.14
java 연동 callablestatement  (0) 2020.12.14
javascript with 구문  (0) 2020.08.19
JavaScript 페이지이동  (0) 2020.08.19
JavaScript 함수  (0) 2020.08.19