[JAVA]Chapter10 날짜와 시간 &형식화 - 1

WOOK JONG KIM·2022년 9월 25일

자바의 정석

목록 보기
12/25
post-thumbnail

Calendar 클래스

Date클래스를 개선한 클래스로 JDK1.1부터 제공되었지만, 몇 가지 단점이 존재

추상클래스 -> 직접 객체 생성 불가

Calendar cal = new Calendar( );
(오류 : 추상클래스이므로 인스턴스 생성 불가)

Calendar cal = Calendar.getInstance( );

보통 get메서드를 통해 원하는 값을 얻어옴!

활용 예제

import java.util.*;

public class ch10 {

	public static void main(String[] args) 
	{ // 디폴트 값 : 현재날짜와 시간으로 설정
		Calendar today = Calendar.getInstance();
		System.out.println("연도: "+ today.get(Calendar.YEAR));
		// MONTH는 1~12가 아니라 0~11 
		System.out.println("월  "+ today.get(Calendar.MONTH));
		System.out.println("이 해의 몇째 주   "+ today.get(Calendar.WEEK_OF_YEAR));
		System.out.println("이 달의 몇째 주  "+ today.get(Calendar.WEEK_OF_MONTH));
		
		// DATE와 DAY_OF_MONTH는 같음
		System.out.println("이 달의 몇 일 :  "+ today.get(Calendar.DATE));
		System.out.println("이 달의 몇 일 :  "+ today.get(Calendar.DAY_OF_MONTH));
		System.out.println("이 해 의 몇 일 :  "+ today.get(Calendar.DAY_OF_YEAR));
		System.out.println("요일(1~7) 1: 일요일  :  "+ today.get(Calendar.DAY_OF_WEEK));
		System.out.println("이 달의 몇째 요일 :  "+ today.get(Calendar.DAY_OF_WEEK_IN_MONTH));
		System.out.println("오전(0), 오후(1)  :  "+ today.get(Calendar.AM_PM));
		
		System.out.println("시간(0~11)  :  "+ today.get(Calendar.HOUR));
		System.out.println("시간(0~23)  "+ today.get(Calendar.HOUR_OF_DAY));
		System.out.println("분(0~59)   :  "+ today.get(Calendar.MINUTE));
		System.out.println("초(0~59)   :  "+ today.get(Calendar.SECOND));
		System.out.println("1000분의 1(0~999)  :  "+ today.get(Calendar.MILLISECOND));
		
	}

}
연도: 2022
월  8
이 해의 몇째 주   39
이 달의 몇째 주  4
이 달의 몇 일 :  23
이 달의 몇 일 :  23
이 해 의 몇 일 :  266
요일(1~7) 1: 일요일  :  6
이 달의 몇째 요일 :  4
오전(0), 오후(1)  :  1
시간(0~11)  :  2
시간(0~23)  14
분(0~59)   :  0
초(0~59)   :  32
1000분의 1(0~999)  :  388
package ch10;
import java.util.*;

public class Ex10_2 {

	public static void main(String[] args) {
		// 요일은 1부터 시작하기 때문에, DAY_OF_WEEK[0]은 비워두었다 
		final String[] DAY_OF_WEEK  = {"", "일","월","화","수","목","금","토"};
		
		Calendar date1 = Calendar.getInstance();
		Calendar date2 = Calendar.getInstance();
		
		//month의 경우 0부터 시작하기에 4월인 경우,3으로 지정해야함
		// date1.set(2019, Calendar.APRIL, 29);  와 같이 할 수도 있다.
		date1.set(2019,3,29); // 2019 4월 29일로 날짜 설정 
		System.out.println("date1은" + toString(date1) 
								+ DAY_OF_WEEK[date1.get(Calendar.DAY_OF_WEEK)] + "요일이고,");
		System.out.println("오늘(date2)은" + toString(date2) 
		+ DAY_OF_WEEK[date2.get(Calendar.DAY_OF_WEEK)] + "요일입니다. ");
		
		// 두 날짜간의 차이를 얻으려면, getTimeINMillis() 천분의 일초 단위로 변환해야 한다. 
		// TimeinMIllis() 천분의 1초 단위로 반환하기에 1000으로 나눠주어야
		
		long difference = (date2.getTimeInMillis() - date1.getTimeInMillis()) / 1000;
		System.out.println("date1과 date2의 초 차이는" + difference);
		System.out.println("일로 계산하면 " + difference/(24*60*60) + "일입니다. ");
	}
	
	public static String toString(Calendar date) {
		return date.get(Calendar.YEAR)+ "년 " + (date.get(Calendar.MONTH)+1) + "월 " + 
						date.get(Calendar.DATE) + "일 ";
	}

}
date1은2019년 4월 29일 월요일이고,
오늘(date2)은2022년 9월 23일 금요일입니다. 
date1과 date2의 초 차이는107395200
일로 계산하면 1243일입니다. 
package ch10;
import java.util.*;

public class Ex10_3 {

	public static void main(String[] args) {
		final int[] TIME_UNIT = {3600,60,1}; // 	큰 단위를 앞에 둔다;
		final String[] TIME_UNIT_NAME = {"시간", "분", "초 "};
		
		Calendar time1 = Calendar.getInstance();
		Calendar time2 = Calendar.getInstance();
		
		time1.set(Calendar.HOUR_OF_DAY, 10); // time1을 10시 20분 30초로 설정 
		time1.set(Calendar.MINUTE, 20);
		time1.set(Calendar.SECOND, 30);
		
		time1.set(Calendar.HOUR_OF_DAY, 20);
		time1.set(Calendar.MINUTE, 30);
		time1.set(Calendar.SECOND, 10);
		
		System.out.println("time1 :" + time1.get(Calendar.HOUR_OF_DAY)+ "시 "
				+ time1.get(Calendar.MINUTE)+ "분 " + time1.get(Calendar.SECOND)+ "초" );	
		System.out.println("time2 :" + time2.get(Calendar.HOUR_OF_DAY)+ "시 "
				+ time2.get(Calendar.MINUTE)+ "분 " + time2.get(Calendar.SECOND)+ "초" );	
		
		long difference =
				Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000;
		System.out.println("time1과 time2의 차이는 " + difference + "초 입니다. ");
		
		String tmp = "";
		for(int i =0; i < TIME_UNIT.length;i++) {
			tmp += difference/TIME_UNIT[i] + TIME_UNIT_NAME[i];
			difference %= TIME_UNIT[i];
		}
		System.out.println("시 분초로 변환하면 " + tmp + "입니다. ");
	}

}
time1 :20시 30분 10초
time2 :14시 28분 29초
time1과 time2의 차이는 21700초 입니다. 
시 분초로 변환하면 6시간1분40초 입니다. 
package ch10;

import java.util.Calendar;

public class Ex10_4 {

	public static void main(String[] args) {
		Calendar date = Calendar.getInstance();
		date.set(2019,7,31);  // 2019/8/31
		
		System.out.println(toString(date));
		System.out.println("= 1일 후 = ");
		date.add(Calendar.DATE, 1);
		System.out.println(toString(date));
		
		System.out.println("= 6달  = ");
		date.add(Calendar.MONTH, -6);
		System.out.println(toString(date));
		
		// roll은 다른 필드에 영향 미치지 않음!!
		// 일 필드가 말일 일때 roll 메서드로 월 필드를 변경하면 일필드에 영향 미칠수도 있 
		System.out.println("= 31일 후(roll) = ");
		date.roll(Calendar.DATE, 31);
		System.out.println(toString(date));
		
		System.out.println("= 31일 후 = ");
		date.add(Calendar.DATE, 31);
		System.out.println(toString(date));
		
		
	}

	public static String toString(Calendar date) {
		return date.get(Calendar.YEAR)+ "년 " + (date.get(Calendar.MONTH)+1) + "월 " + 
						date.get(Calendar.DATE) + "일 ";
	}
}
2019년 8월 31일 
= 1일 후 = 
2019년 9월 1일 
= 6달  = 
2019년 3월 1일 
= 31일 후(roll) = 
2019년 3월 1일 
= 31일 후 = 
2019년 4월 1일 
package ch10;
import java.util.*;
// Run Configuration에서 Argument 꼭 넣어주기!!

public class Ex10_5 {

	public static void main(String[] args) {
		if(args.length != 2)
		{
			System.out.println("Usage : java Ex10_5 2022 9");
			return;
		}
		
		
		int year = Integer.parseInt(args[0]);
		int month = Integer.parseInt(args[1]);
		int START_DAY_OF_WEEK = 0;
		int END_DAY = 0;
		
		Calendar sDay = Calendar.getInstance(); // 시작일
		Calendar eDay = Calendar.getInstance(); // 끝 일 
		
		// 월의 경우 0부터 11까지의 값을 가지므로 1을 빼주어야함. 
		sDay.set(year, month-1,1);
		eDay.set(year, month,1);
		
		// 다음달의 첫날(12월 1일)에서 하루를 빼면 현재달의 마지막날(11월 30일)이 된다.
		eDay.add(Calendar.DATE, -1);
		
		// 첫번째 요일이 무슨 요일인지 알아낸다.
		START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
		
		// eDay에 지정된 날짜를 얻어온다. 
		END_DAY = eDay.get(Calendar.DATE);
		
		System.out.println("		" + args[0] + "년"+args[1]+"월");
		System.out.println();
		System.out.println(" SU MO TU WE TH	 FR SA");
		
		//해당 월의 1일이 어느 요일인지에 따라서 공백 출력
		// 만일 1일이 수요일이라면 공백을 세번 찍는다.(일요일 부터 시작)
		
		for(int i =1; i < START_DAY_OF_WEEK; i++) {
			System.out.print("      ");
		}
		
		for(int i = 1, n = START_DAY_OF_WEEK; i <= END_DAY; i++, n++)
		{
			System.out.print((i<10)? "   "+ i : "  " +i);
			if(n%7==0) System.out.println();
		}

	}

}
	2022년  9월

 SU MO TU WE TH	 FR SA
              1   2  3
  4  5  6  7  8   9  10
  11 12 13 14 15  16 17
  18 19 20 21 22  23 24
  25 26 27 28 29  30

Date 로 변환

  1. Calendar -> Date
Calendar cal = Calendar.getInstance();
...
Date d = new Date(cal.getTimeInMillis()); //Date(long date)
  1. Date -> Calendar
Date d = new Date();
...
Calendar cal = Calendar.getInstance();
cal.setTime(d)

형식화 클래스

형식화 클래스는 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화한 클래스

데이터를 정의된 패턴에 맞춰 형식화 할 수 있을 뿐 아니라 형식화된 데이터에서 원래의 데이터를 얻을 수 있다

DecimalFormat

숫자 데이터를 다양한 형식으로 표현하는 방법

출력 형식의 패턴을 작성하여 DecimalFormat 인스턴스 생성 후 출력하고자 하는 문자열로 format 메서드 호출

package ch10;

import java.text.*;

public class Ex10_6 {

	public static void main(String[] args) {
		double number = 1234567.89;
		String[] pattern = 
		{
		"0",
		"#",
		"0.0",
		"#.#",
		"0000000000.0000",
		"##########.####",
		"#.#-",
		"-#.#",
		"#,###.##",
		"#,####.##",
		"#E0",
		"0E0",
		"##E0",
		"####E0",
		"0000E0",
		"#.#E0",
		"0.0E0",
		"0.000000000E0",
		"00.00000000E0",
		"000.0000000E0",
		"#.#########E0",
		"##.########E0",
		"###.#######E0",
		"#,###.##+;#,###.##-",
		"#.#%",
		"#.#\u2030",
		"\u00A4 #,###",
		"'#'#,###",
		"''#,###",
		};

	
	for (int i = 0; i < pattern.length; i++)
	{
		DecimalFormat df = new DecimalFormat(pattern[i]);
		System.out.printf("%19s : %s\n", pattern[i], df.format(number));
	}
	}
}
       			0 : 1234568
                  # : 1234568
                0.0 : 1234567.9
                #.# : 1234567.9
    0000000000.0000 : 0001234567.8900
    ##########.#### : 1234567.89
               #.#- : 1234567.9-
               -#.# : -1234567.9
           #,###.## : 1,234,567.89
          #,####.## : 123,4567.89
                #E0 : .1E7
                0E0 : 1E6
               ##E0 : 1.2E6
             ####E0 : 123.5E4
             0000E0 : 1235E3
              #.#E0 : 1.2E6
              0.0E0 : 1.2E6
      0.000000000E0 : 1.234567890E6
      00.00000000E0 : 12.34567890E5
      000.0000000E0 : 123.4567890E4
      #.#########E0 : 1.23456789E6
      ##.########E0 : 1.23456789E6
      ###.#######E0 : 1.23456789E6
#,###.##+;#,###.##- : 1,234,567.89+
               #.#% : 123456789%
               #.#‰ : 1234567890‰
            ¤ #,### : ₩ 1,234,568
           '#'#,### : #1,234,568
            ''#,### : '1,234,568
package ch10;

import java.text.*;

public class Ex10_7 {
	public static void main(String[] args)
	{
		DecimalFormat df = new DecimalFormat("#,###.##");
		DecimalFormat df2 = new DecimalFormat("#.###E0");
		
		try {
			// parse 메서드는 기호와 문자가 포함된 문자열을 숫자로 변환
			// Integer.parseInt는 콤마가 포함된 문자열을 숫자로 변환 X
			
			Number num = df.parse("1,234,567.89");
			System.out.print("1,234,567.89" + " -> ");
			
			// Number에 저장된 값을 double형의 값으로 반환
			double d = num.doubleValue();
			System.out.print(d + " -> ");
			
			System.out.println(df2.format(num));
		} catch (Exception e) {}
	}
}
1,234,567.89 -> 1234567.89 -> 1.235E6

SimpleDateFormat

날짜 데이터를 원하는 형태로 표시

원하는 출력형식 패턴 장석해서 SimpleDateFormat 인스턴스 생성 후, 출력하고자 하는 Date인스턴스를 가지고 format 호출

package ch10;

import java.util.*;
import java.text.*;
public class Ex10_8 {

	public static void main(String[] args) {
		Date today = new Date();
		
		SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
		SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9;
		
		sdf1 = new SimpleDateFormat("yyyy-MM-dd");
		sdf2 = new SimpleDateFormat("''y년 MMM dd일 E요일");
		sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm ss.SSS");
		sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
		
		sdf5 = new SimpleDateFormat("오늘은 올 해의 D번째 날입니다.");
		sdf6 = new SimpleDateFormat("오늘은 이 달의 d번째 날입니다.");
		sdf7 = new SimpleDateFormat("오늘은 올 해의 w번째 입니다.");
		sdf8 = new SimpleDateFormat("오늘은 이 달 의 W번째 입니다.");
		sdf9 = new SimpleDateFormat("오늘은 이 달의 F번째  E요입니다.");
		
		System.out.println(sdf1.format(today));
		System.out.println(sdf2.format(today));
		System.out.println(sdf3.format(today));
		System.out.println(sdf4.format(today));
		System.out.println();
		System.out.println(sdf5.format(today));
		System.out.println(sdf6.format(today));
		System.out.println(sdf7.format(today));
		System.out.println(sdf8.format(today));
	}

}
2022-09-25
'2022년 9월 25일 일요일
2022-09-25 18:47 52.133
2022-09-25 06:47:52 오후

오늘은 올 해의 268번째 날입니다.
오늘은 이 달의 25번째 날입니다.
오늘은 올 해의 40번째 입니다.
오늘은 이 달 의 5번째 입니다.
package ch10;

import java.util.*;
import java.text.*;

public class Ex10_9 {

	public static void main(String[] args) {
		DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
		DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
		
		try {
			/* parse는 문자열을 날짜 Date인스턴스로 변환해 줌
			 
			(SimpleDateFormat의 조상인 DateFormat에 정의)
			
			원래라면 문자열을 날짜로 인식하기 위해 substring 이용 해야 함.*/
			
			Date d = df.parse("2019년 11월 23일");
			System.out.println(df2.format(d));
		}catch(Exception e) {}

	}

}
2019/11/23
package ch10;

import java.util.*;
import java.text.*;

public class Ex10_10 {

	public static void main(String[] args) {
		String pattern = "yyyy/MM/dd";
		DateFormat df = new SimpleDateFormat(pattern);
		Scanner s = new Scanner(System.in);
		
		Date inDate = null;
		
		System.out.println("날짜를 " + pattern 
				+ "의 형태로 입력해주세요(입력예 : 2019/12/31)");
		
		//먼저 hasNextLine()은 다음에 읽을 값이 있는지 확인하는  불린타입의 메소드로 값이 있으면 트루를 반환한다.
        /* 지정된 패턴으로 인력하지 않을 시 Exception이 발생하여
        	while 탈출 못함 */
		while(s.hasNextLine()) {
			try {
				inDate = df.parse(s.nextLine());
				break;
			}catch(Exception e) {
				System.out.println("날짜를 " + pattern 
						+ "의 형태로 다시 입력해주세요(입력예 : 2019/12/31)");
			}
		}
		
		Calendar cal = Calendar.getInstance();
		cal.setTime(inDate);
		
		Calendar today = Calendar.getInstance();
		long day = (cal.getTimeInMillis() 
														- today.getTimeInMillis())/(60*60*1000);
		System.out.println("입력 하신 날짜는 현재와 " + day + " 시간 차이가 납니다. ");
	}

}
날짜를 yyyy/MM/dd의 형태로 입력해주세요(입력예 : 2019/12/31)
2030/01/01
입력 하신 날짜는 현재와 63700 시간 차이가 납니다. 
profile
Journey for Backend Developer

0개의 댓글