모든날짜·시간문자열java.util.Date,,,java.util.Calendar로 변환
Java의 모든날짜, 시간 문자열가능하다면 java.util.Calendar ,,, java.util.Date 형식으로 변환하는 샘플 프로그램입니다.
변환에는 일단 디폴트의 일자·시각 문자열에 포맷을 실시하고 그 후 java.util.Calendar 형식으로 변환합니다. 변환이 불가능한 경우는 IllegalArgumentException 가 슬로우 됩니다
또한,java.util.Date 형태로의 변환은 Calendar 클래스의 getTime() 메소드를 사용합니다.
변환 가능한 날짜 형식은 다음과 같습니다.
샘플 프로그램
int yyyy = Integer.parseInt(strDate.substring(0,4));
int MM = Integer.parseInt(strDate.substring(5,7));
int dd = Integer.parseInt(strDate.substring(8,10));
int HH = cal.get(Calendar.HOUR_OF_DAY);
int mm = cal.get(Calendar.MINUTE);
int ss = cal.get(Calendar.SECOND);
int SSS = cal.get(Calendar.MILLISECOND);
cal.clear();
cal.set(yyyy,MM-1,dd);
int len = strDate.length();
switch (len) {
case 10:
break;
case 16: // yyyy/MM/dd HH:mm
HH = Integer.parseInt(strDate.substring(11,13));
mm = Integer.parseInt(strDate.substring(14,16));
cal.set(Calendar.HOUR_OF_DAY,HH);
cal.set(Calendar.MINUTE,mm);
break;
case 19: //yyyy/MM/dd HH:mm:ss
HH = Integer.parseInt(strDate.substring(11,13));
mm = Integer.parseInt(strDate.substring(14,16));
ss = Integer.parseInt(strDate.substring(17,19));
cal.set(Calendar.HOUR_OF_DAY,HH);
cal.set(Calendar.MINUTE,mm);
cal.set(Calendar.SECOND,ss);
break;
case 23: //yyyy/MM/dd HH:mm:ss.SSS
HH = Integer.parseInt(strDate.substring(11,13));
mm = Integer.parseInt(strDate.substring(14,16));
ss = Integer.parseInt(strDate.substring(17,19));
SSS = Integer.parseInt(strDate.substring(20,23));
cal.set(Calendar.HOUR_OF_DAY,HH);
cal.set(Calendar.MINUTE,mm);
cal.set(Calendar.SECOND,ss);
cal.set(Calendar.MILLISECOND,SSS);
break;
default :
throw new IllegalArgumentException (
“인수 문자열 [“+ strDate +
“]는 날짜 문자열로 변환할 수 없습니다”);
}
return cal;
}
/**
* 다양한 날짜, 시간 문자열을 기본 날짜 및 시간 형식
* 로 변환합니다.
*
* ● 기본 날짜 형식은 다음과 같습니다.
* 날짜 전용: yyyy/MM/dd
* 날짜 + 시간의 경우: yyyy/MM/dd HH:mm:ss.SSS
*
* @param str 변환 대상 문자열
* @return 기본 날짜/시간 형식
* @throws IllegalArgumentException
* 날짜 문자열이 변환 불가능한 경우
*/
private static String format(String str){
if (str == null || str.trim().length() < 8) {
throw new IllegalArgumentException (
“인수 문자열 [“+ str +
“]는 날짜 문자열로 변환할 수 없습니다”);
}
str = str.trim();
String yyyy = null; String MM = null; String dd = null;
String HH = null; String mm = null;
String ss = null; String SSS = null;
// “-” or “/” 가 없는 경우
if (str.indexOf(“/”)==-1 && str.indexOf(“-“)==-1) {
if (str.length() == 8) {
yyyy = str.substring(0,4);
MM = str.substring(4,6);
dd = str.substring(6,8);
return yyyy+”/”+MM+”/”+dd;
}
yyyy = str.substring(0,4);
MM = str.substring(4,6);
dd = str.substring(6,8);
HH = str.substring(9,11);
mm = str.substring(12,14);
ss = str.substring(15,17);
return yyyy+”/”+MM+”/”+dd+” “+HH+”:”+mm+”:”+ss;
}
StringTokenizer token = new StringTokenizer(str,”_/-:. “);
StringBuffer result = new StringBuffer();
for(int i = 0; token.hasMoreTokens(); i++) {
String temp = token.nextToken();
switch(i){
case 0:// 년의 부분
yyyy = fillString(str, temp, “L”, “20”, 4);
result.append(yyyy);
break;
case 1:// 달 부분
MM = fillString(str, temp, “L”, “0”, 2);
result.append(“/”+MM);
break;
case 2:// 일 부분
dd = fillString(str, temp, “L”, “0”, 2);
result.append(“/”+dd);
break;
case 3:// 시간 부분
HH = fillString(str, temp, “L”, “0”, 2);
result.append(” “+HH);
break;
case 4:// 분 부분
mm = fillString(str, temp, “L”, “0”, 2);
result.append(“:”+mm);
break;
case 5:// 초 부분
ss = fillString(str, temp, “L”, “0”, 2);
result.append(“:”+ss);
break;
case 6:// 밀리초 부분
SSS = fillString(str, temp, “R”, “0”, 3);
result.append(“.”+SSS);
break;
}
}
return result.toString();
}
private static String fillString (String strDate, String str,
String position, String addStr,
int len) {
if (str.length() > len) {
throw new IllegalArgumentException (
“인수 문자열 [“+ strDate +
“]는 날짜 문자열로 변환할 수 없습니다”);
}
return fillString(str, position, len, addStr);
}
/**
* 문자열 [str]에 대해 보충 할 문자열 [addStr]
* [position]의 위치에 [len]이 충족될 때까지 삽입합니다.
*
* ※ [str]이 null이나 빈 리터럴 인 경우에도 [addStr]
* [len]이 충족될 때까지 삽입한 결과를 반환합니다.
* @param str 대상 문자열
* @param position 앞에 삽입 ⇒ L or l 뒤에 삽입 ⇒ R or r
* @param len 보충하기 전의 자릿수
* @param addStr 삽입 할 문자열
* @return 변환 후 문자열.
*/
private static String fillString(String str, String position,
int len,
String addStr) {
if (addStr == null || addStr.length() == 0) {
throw new IllegalArgumentException
(“삽입할 문자열 값이 잘못되었습니다. addStr=”+addStr);
}
if (str == null) {
str = “”;
}
StringBuffer buffer = new StringBuffer(str);
while (len > buffer.length()) {
if (position.equalsIgnoreCase("l")) {
int sum = buffer.length() + addStr.length();
if (sum > len) {
addStr = addStr.substring
(0,addStr.length() – (sum – len));
buffer.insert(0, addStr);
}else{
buffer.insert(0, addStr);
}
} else {
buffer.append(addStr);
}
}
if (buffer.length() == len) {
return buffer.toString();
}
return buffer.toString().substring(0, len);
}
실행 결과
◆실행예
// yyyy-MM-dd 패턴
cal = toCalendar("2007-01-01");
date = cal.getTime();
System.out.println(“[2007-01-01] = '”+date+”'”);
// yyyyMMdd 패턴
cal = toCalendar("20070101");
date = cal.getTime();
System.out.println(“[20070101] = '”+date+”'”);
// yy-MM-dd 패턴
cal = toCalendar("07-01-01");
date = cal.getTime();
System.out.println(“[07-01-01] = '”+date+”'”);
System.out.println(“\n—– 날짜+시간 ————————–“);
// yyyy/MM/dd HH:mm:ss 패턴
cal = toCalendar("2007/01/01 12:00:00");
date = cal.getTime();
System.out.println(“[2007/01/01 12:00:00] = '”+date+”'”);
// yyyyMMdd HH:mm:ss 패턴
cal = toCalendar("20070101 12:00:00");
date = cal.getTime();
System.out.println(“[20070101 12:00:00] = '”+date+”'”);
// yyyy/MM/dd HH:mm 패턴
cal = toCalendar("2007/01/01 12:00");
date = cal.getTime();
System.out.println(“[2007/01/01 12:00] = '”+date+”'”);
System.out.println(“\n—– 시간만 —————————“);
// HH:mm:ss 패턴. ※시각만의 경우는 일자를 전에 부가해 사용한다.
cal = toCalendar(
new SimpleDateFormat("yyyy/MM/dd").format(new Date()) +
” 12:00:00″);
date = cal.getTime();
System.out.println(“[12:00:00] = '”+date+”'”);
}
◆출력 결과
----- 날짜 전용 --------------------------- [2007/01/01] = 'Mon Jan 01 00:00: 00 JST 2007' [2007-01-01] = 'Mon Jan 01 00:00:00 JST 2007' [20070101] = 'Mon Jan 01 00:00:00 JST 2007' [07-01-01] = ' Jan 01 00:00:00 JST 2007' ----- 날짜 + 시간 -------------------------- [2007/01/01 12:00:00] = 'Mon Jan 01 12:00:00 JST 2007' [20070101 12:00:00] = 'Mon Jan 01 12:00:00 JST 2007' [2007/01/01 12:00 = 'Mon Jan 01 12:00:00 JST 2007' ----- 시간 만 --------------------------- [12: 00:00] = 'Wed Jun 06 12:00:00 JST 2007'
이 샘플 프로그램은 Chat & Messenger의 "캘린더 일정 관리 기능"에서 실제로 사용하고 있습니다.