원지의 개발
article thumbnail
728x90

2022.10.25 - [프로그래밍 언어/Java] - [Java] API_ java.util (arrays - search, date, calendar, random)

→ 이어서 추가적인 설명과 연습과제 진행해보았다.

Date

  • Calendar가 새로 추가되면서 Date의 메서드가 'deprecated' 되었으므로 잘 사용하지 않음
  • 그럼에도 Date를 필요로 하는 메서드가 있으므로 변환 방법 알기

Date ↔ Calendar

package dateAndCalendarTest;

import java.util.Calendar;
import java.util.Date;

public class DateCalendarChange {

	public static void main(String[] args) {
    //1. Date → Calendar
		Calendar cal1 = Calendar.getInstance();
		Date d1 = new Date(cal1.getTimeInMillis()); //1/1000초 단위 시간
		System.out.println(d1.toString());
		
    //2. Calendar → Date
		Date d2 = new Date();
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(d2);
        System.out.println(cal2.get(Calendar.YEAR));
		System.out.println(toString(cal2));
	}
	
	public static String toString(Calendar date) {
		return
			date.get(Calendar.YEAR) + "년 "
		  + date.get(Calendar.MONTH) + "월 "
		  + date.get(Calendar.DATE) + "일";
	}
}

-----------------------------------------------------------------------------------
Fri Sep 01 12:01:37 KST 2023
2023
2023년 8월 1일

LocalDate / LocalTime / LocalDateTime

  • 날짜만 나타내는 LocalDate
  • 시간만 나타내는 LocalTime
  • 날짜 및 시간 나타내는 LocalDateTime
  • 을 계산할 때 -1을 하지 않아도 됨

년월일 비교 - 같으면 시간과 분 / 다르면 년월일을 출력

package dateAndCalendarTest;

import java.time.LocalDate;
import java.time.LocalDateTime;

public class DateCompare {

	public static void main(String[] args) {
		//기준, 현재 날짜
		LocalDateTime currentTime = LocalDateTime.now();
		
		LocalDate date1 = LocalDate.of(2023, 9, 1);
		LocalDate date2 = LocalDate.of(2023, 1, 1);
		
		//LocalDateTime 과 LocalDate 비교시
		if(date1.isEqual(currentTime.toLocalDate())) {
			System.out.println(currentTime.getHour() + "시 " + currentTime.getMinute() + "분");
		}
		
		if(!date2.isEqual(currentTime.toLocalDate())){
			System.out.println("기준 날짜: " + currentTime.toString().substring(0, 10));
			System.out.println("비교 날짜: " + date2.toString());
		}
	}
}
-----------------------------------------------------------------------------------------------
13시 2분
기준 날짜: 2023-09-01
비교 날짜: 2023-01-01
  • LocalDateTime, LocalDate 비교시 isEqual 메서드 사용
  • 혹은 같은 클래스 사용시 compareTo 메서드 사용
    같으면 0, 이전 날짜 -1, 이후 날짜 1 반환

Calendar

add / roll 메서드

  • add(int field, int amount) - 원하는 만큼 증가 또는 감소
    증가시 31일을 넘기면 다음달로 넘어가므로 MONTH값이 증가
  • roll(int field, int amount) - 다른 필드에 영향을 미치지 않음
    월 필드의 값을 변하지 않고, 일 필드 값만 바뀜
    BUT, 일 필드가 말일 일 때, 월 필드를 변경하면 일 필드에 영향을 미침

날짜의 연산 (뺄셈)

package dateAndCalendarTest;

import java.util.Calendar;

public class CalendarDaySubtraction {

	public static void main(String[] args) {
		//요일은 1부터 시작
		final String[] DAY_OF_WEEK = {"", "일", "월", "화", "수", "목", "금", "토"};
		
		Calendar cal1 = Calendar.getInstance(); //비교 날짜
		Calendar cal2 = Calendar.getInstance(); //현재 날짜 (2023-09-01)
		
		cal1.set(2023, 2, 2);
		System.out.println("비교날짜: " + toString(cal1) + DAY_OF_WEEK[cal1.get(Calendar.DAY_OF_WEEK)] + "요일");
		System.out.println("현재날짜: " + toString(cal2) + DAY_OF_WEEK[cal2.get(Calendar.DAY_OF_WEEK)] + "요일");
		
		//두 날짜의 차이 계산
		long difference = (cal2.getTimeInMillis() - cal1.getTimeInMillis()) / 1000;
		System.out.println(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) + "일 ";
	}
}
-----------------------------------------------------------------------------------------------------
비교날짜: 2023년 3월 2일 목요일
현재날짜: 2023년 9월 1일 금요일
15811200초 지남
183일 지남

시간의 연산 (뺄셈)

package dateAndCalendarTest;

import java.util.Calendar;

public class CalendarTimeSubtraction {

	public static void main(String[] args) {
		final int[] TIME_UNIT = {3600, 60, 1};
		final String[] TIME_UNIT_NAME = {"시간 ", "분 ", "초 "};
		
		Calendar calTime1 = Calendar.getInstance();
		Calendar calTime2 = Calendar.getInstance();
		
		calTime1.set(Calendar.HOUR_OF_DAY, 10);
		calTime1.set(Calendar.MINUTE, 20);
		calTime1.set(Calendar.SECOND, 30);
		System.out.println("비교시간: " + toString(calTime1));
		System.out.println("현재시간: " + toString(calTime2));
		
		//두 날짜의 시간 차이 계산
		long difference = Math.abs(calTime2.getTimeInMillis() - calTime1.getTimeInMillis()) / 1000;
		System.out.println(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);
	}
	
	public static String toString(Calendar date) {
		return date.get(Calendar.HOUR_OF_DAY) + "시 "
             + date.get(Calendar.MINUTE) + "분 "
             + date.get(Calendar.SECOND) + "초 ";
	}
}
-----------------------------------------------------------------------------------------------------
비교시간: 10시 20분 30초 
현재시간: 15시 1분 40초 
16870초 지남
시분초로 변환시 4시간 41분 10초

달력 출력

package dateAndCalendarTest;

import java.util.Calendar;

public class CalendarTest {

	public static void main(String[] args) {
		if(args.length != 2) {
			System.out.println("Usage : java CalendarTest 2023 9"); //args[0]=2023, args[1]=9
			return;
		}
		
		int year = Integer.parseInt(args[0]);
		int month = Integer.parseInt(args[1]);
		int START_DAY_OF_WEEK = 0; //1일의 요일
		int END_DAY = 0; //마지막 일
		
		Calendar sDay = Calendar.getInstance();
		Calendar eDay = Calendar.getInstance();
		
		//0~11
		sDay.set(year, month-1, 1); //9월 1일
		eDay.set(year, month, 1); //10월 1일
		
		//다음 달의 1일에서 하루를 빼면 이번 달의 마지막 일
		eDay.add(Calendar.DATE, -1); //9월 30일
		
		START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
		END_DAY = eDay.get(Calendar.DATE); //eDay에 지정된 날짜
		
		System.out.println("         " + args[0] + "년 " + args[1] + "월");
		System.out.println("  SU  MO  TU  WE  TH  FR  SA");
		
		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년 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
  • eDay.add(Calendar.DATE, -1); 말고
    getActualMaximum(Calendar.DATE) 메서드를 사용해서 해당 월의 마지막 날짜 구하기 가능

DecimalFormat

  • java.text 패키지의 형식화 클래스
  • 형식화된 데이터의 패턴만 정의해주면 복잡한 문자열에서도 subString() 사용하지 않고 원하는 값 얻기 가능
  • 숫자 → 정수, 부동소수점, 금액 등으로 표현 가능

사용1 - 문자 출력

package dateAndCalendarTest;

import java.text.DecimalFormat;

public class DecimalFormatTest {

	public static void main(String[] args) {
		double number = 1234567.89;
		
		DecimalFormat df = new DecimalFormat("#.#E0");
		String result = df.format(number);
		
		System.out.println(result);
	}
}
-------------------------------------------------------
1.2E6
  • 출력 형식의 패턴 작성하여 DecimalFormat 인스턴스 생성 후, 출력하고자 하는 문자열로 format 메서드 호출

사용2 - 숫자 출력

  • Integer.parse 메서드는 콤마(,)가 포함된 문자열을 숫자로 변환 X
package dateAndCalendarTest;

import java.text.DecimalFormat;

public class DecimalFormatTest2 {

	public static void main(String[] args) {
		DecimalFormat df1 = new DecimalFormat("#,###.##");
		DecimalFormat df2 = new DecimalFormat("#.###E0");
		
		try {
			Number num = df1.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) {}
	}
}
-----------------------------------------------------------
1,234,567.89 → 1234567.89 → 1.235E6
  • parse(String source)는 DecimalFormat의 조상인 NumberFormat에 정의된 메서드
  • Number 클래스는 Integer, Double의 래퍼 클래스의 조상
  • doubleValue()는 Number에 저장된 값을 double 형으로 변환하여 반환
728x90
profile

원지의 개발

@원지다

250x250