* 일자 : 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 |