자바의 정석 <기초편> 📌chapter10. 날짜와 시간 & 형식화

모깅·2023년 2월 25일
0

📖 01. 날짜와 시간


📖 02. Calendar클래스

  • getInstance()를 원하는 클래스에서 사용 한다고 했을 때, 나라가 바뀌다면 getInstance()는 변경 해야겠지만 클래스는 변경 할 필요가 없다.


📖 03. Calendar 예제 1

<예제 10-1 >

✍️ 입력

import java.util.*;

class Ex10_1 {
	public static void main(String[] args) 
	{  // 기본적으로 현재날짜와 시간으로 설정된다.
		Calendar today = Calendar.getInstance();	
		System.out.println("이 해의 년도 : " + today.get(Calendar.YEAR));
 	   System.out.println("월(0~11, 0:1월): " + 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)); // 1:일요일, 2:월요일, ... 7:토요일
	 	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));
 		// 천분의 1초를 시간으로 표시하기 위해 3600000으로 나누었다.(1시간 = 60 * 60초)
		System.out.println("TimeZone(-12~+12): " 
                    + (today.get(Calendar.ZONE_OFFSET)/(60*60*1000))); 
		System.out.println("이 달의 마지막 날: " 
            + today.getActualMaximum(Calendar.DATE) ); // 이 달의 마지막 일을 찾는다.
	}
}

💻 출력
이 해의 년도 : 2023
월(0~11, 0:1월): 1
이 해의 몇 째 주: 8
이 달의 몇 째 주: 4
이 달의 몇 일: 25
이 달의 몇 일: 25
이 해의 몇 일: 56
요일(1~7, 1:일요일): 7
이 달의 몇 째 요일: 4
오전_오후(0:오전, 1:오후): 1
시간(0~11): 4
시간(0~23): 16
분(0~59): 9
초(0~59): 51
1000분의 1초(0~999): 631
TimeZone(-12~+12): 9
이 달의 마지막 날: 28


📖 04. Calendar 예제 2

<예제 10-2 >

✍️ 입력

import java.util.*;

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() 천분의 일초 단위로 변환해야한다.
   	long difference = 
            (date2.getTimeInMillis() - date1.getTimeInMillis())/1000;
		System.out.println("그 날(date1)부터 지금(date2)까지 "
                                           + difference +"초가 지났습니다.");
		System.out.println("일(day)로 계산하면 "+ difference/(24*60*60) 
                                     +"일입니다."); // 1일 = 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)은 2023년 2월 25일 토요일입니다.
그 날(date1)부터 지금(date2)까지 120787200초가 지났습니다.
일(day)로 계산하면 1398일입니다.


📖 05. Calendar 예제 3

<예제 10-3 >

✍️ 입력

import java.util.*;

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);

		time2.set(Calendar.HOUR_OF_DAY, 20); // time2을 20시 30분 10초로 설정
		time2.set(Calendar.MINUTE, 30);
		time2.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 :10시 20분 30초
time2 :20시 30분 10초
time1과 time2의 차이는 36580초 입니다.
시분초로 변환하면 10시간 9분 40초 입니다.

-> 날짜 계산할 때 초기화 잊지 말 것!


📖 06. Calendar 예제 4

<예제 10-4 >

✍️ 입력

import java.util.*;

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));

		System.out.println("= 31일 후(roll) =");
		date.roll(Calendar.DATE, 31);
		System.out.println(toString(date));

		System.out.println("= 31일 후(add) =");
		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일 후(add) =
2019년 4월 1일

  • add()는 다른 필드에 영향을 주고 roll()은 다른 필드에 영향을 주지 않는다.

📖 07. Calendar 예제 5

<예제 10-5 >

✍️ 입력

import java.util.*; 

class Ex10_5 { 
	public static void main(String[] args) { 
		if(args.length !=2) { 
			System.out.println("Usage : java Ex10_5 2019 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을 빼주어야 한다. 
		// 예를 들어, 2019년 11월 1일은 sDay.set(2019, 10, 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(" 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(); 
		} 
	} 
}

💻 출력
2023년 2월
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

  • 다음달 1월 1일 - 1일 : 이번달 마지막 날

📖 08. Date와 Calendar간의 변환


📖 09. 형식화 클래스

  • 데이터를 정의된 패턴에 맞춰 형식화 할 수 있을 뿐만 아니라 역으로 형식화된 데이터에서 원래의 데이터를 얻어 낼 수 있다.

📖 10. DecimalFormat


📖 11. DecimalFormat 예제 1

<예제 10-6 >

✍️ 입력

import java.text.*;

class Ex10_6 {
	public static void main(String[] args) throws Exception {
		double number  = 1234567.89;
		String[] pattern = {
			"0",
			"#",
			"0.0",
			"#.#",
			"0000000000.0000",
			"##########.####",
			"#.#-",
			"-#.#",
			"#,###.##",
			"#,####.##",
			"#E0",
			"0E0",
			"##E0",
			"00E0",
			"####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));
		}
	} // main
}

💻 출력

              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
           00E0 : 12E5
         ####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

📖 12. DecimalFormat 예제 2

<예제 10-7 >

✍️ 입력

import java.text.*;

class Ex10_7 {
	public static void main(String[] args) {
		DecimalFormat df  = new DecimalFormat("#,###.##");
		DecimalFormat df2 = new DecimalFormat("#.###E0");

		try {
			Number num = df.parse("1,234,567.89");
			System.out.print("1,234,567.89" + " -> ");

			double d = num.doubleValue(); 
			System.out.print(d + " -> ");

			System.out.println(df2.format(num));
		} catch(Exception e) {}
	} // main
}

💻 출력
1,234,567.89 -> 1234567.89 -> 1.235E6


📖 13. SimpleDateFormat


📖 14. SimpleDateFormat 예제 1

<예제 10-8 >

✍️ 입력

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

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("''yy년 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));	// format(Date d)
		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));
		System.out.println(sdf9.format(today));
	}
}

💻 출력
2023-02-25
'23년 2월 25일 토요일
2023-02-25 18:20:31.453
2023-02-25 06:20:31 오후

오늘은 올 해의 56번째 날입니다.
오늘은 이 달의 25번째 날입니다.
오늘은 올 해의 8번째 주입니다.
오늘은 이 달의 4번째 주입니다.
오늘은 이 달의 4번째 토요일입니다.


📖 15. SimpleDateFormat 예제 2

<예제 10-9 >

✍️ 입력

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

class Ex10_9 {
	public static void main(String[] args) {
		DateFormat df  = new SimpleDateFormat("yyyy년 MM월 dd일");
		DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");

		try {
			Date d = df.parse("2019년 11월 23일");
			System.out.println(df2.format(d));
		} catch(Exception e) {}
	} // main
}

💻 출력
2019/11/23


📖 16. SimpleDateFormat 예제 3

<예제 10-10 >

✍️ 입력

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

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)");
		while(s.hasNextLine()) {
			try {
				inDate = df.parse(s.nextLine());
				break;
			} catch(Exception e) {
				System.out.println("날짜를 " + pattern 
				+ "의 형태로 다시 입력해주세요.(입력예:2019/12/31)");
			}
		} // while

		Calendar cal = Calendar.getInstance();
		cal.setTime(inDate);
		Calendar today = Calendar.getInstance();
		long day = (cal.getTimeInMillis()
		- today.getTimeInMillis())/(60*60*1000);
		System.out.println("입력하신 날짜는 현재와 "+ day +"시간 차이가 있습니다.");
	} // main
}

💻 출력
날짜를 yyyy/MM/dd의 형태로 입력해주세요.(입력예:2019/12/31)





[출처] 자바의 정석 <기초편> (남궁 성 지음)

profile
멈추지 않기

0개의 댓글