[Day 7| Java] Date와 Calendar

y♡ding·2024년 10월 22일
0

데브코스 TIL

목록 보기
31/163

📌 java.util.Date 클래스

자바에서 날짜와 시간을 다루기 위한 클래스입니다. 이 클래스는 자바의 초기 버전부터 존재해 왔으며, 날짜와 시간을 표현하고 조작하는 기본적인 기능을 제공합니다.

1. Date 클래스의 기본 개념

Date 클래스는 날짜와 시간을 표현하는 클래스로, 날짜와 시간을 밀리초 단위로 저장합니다.

  • 1970년 1월 1일 00:00:00 GMT를 기준으로 한 밀리초 경과 시간을 저장합니다. 이를 "Epoch Time" 또는 "Unix Time"라고 부릅니다.

2. Date 객체 생성 방법

1) 현재 날짜와 시간 생성

Date 객체를 생성하면 현재 시스템의 날짜와 시간을 반환합니다.

import java.util.Date;

public class Main {
	
public static void main(String[] args) {
	Date currentDate = new Date();  // 현재 날짜와 시간 
	System.out.println(currentDate);
	}
}

2) 지정된 시간으로 날짜 객체 생성

밀리초 단위로 1970년 1월 1일 00:00:00 GMT를 기준으로 한 시간 값을 인자로 받아 특정 날짜를 생성할 수도 있습니다.

// 생성
Date date3 = new Date(2024-1900, 10-1, 0);

// date를 0으로 주게 된다면? 이전 달의 마지막 날이 출력 
System.out.println(date3.toLocaleString());

3. Date 클래스의 주요 메서드

1) getTime()
* 현재 시간을 밀리초 단위로 반환합니다. 이는 Epoch Time을 기준으로 현재까지 경과한 시간을 반환합니다.

Date currentDate = new Date();
long timeInMillis = currentDate.getTime();  // 현재 시간의 밀리초
System.out.println(timeInMillis);

3. Date 클래스 사용 시 주의점

Date 클래스는 시간이 지나면서 설계의 문제점API의 혼란으로 인해 몇 가지 단점이 있습니다.

  • 월(Month) 값의 혼란: getMonth() 메서드는 0부터 11까지의 값을 반환하여, 0은 1월, 11은 12월을 나타냅니다. 이것은 사용자가 혼란스러워할 수 있습니다.
  • 연도 값의 혼란: getYear() 메서드는 1900년을 기준으로 한 연도를 반환합니다. 예를 들어, getYear()가 121을 반환하면 이는 2021년을 의미합니다.
  • Date클래스는 불변하지 않음: Date 객체는 변경 가능(mutable)하므로, 동일한 객체를 여러 곳에서 참조할 경우 문제가 발생할 수 있습니다.
  • 부족한 시간대 지원: Date 클래스는 시간대를 다루는 기능이 부족합니다.
  • 오래된 설계로 인해 많은 메서드가 Deprecated되었습니다.,

<수업코드>

package com.util1;

import java.util.Date;

public class DateEx01 {
	public static void main(String[] args) {
	// Date 객체 생성
	java.util.Date date1 = new java.util.Date();

	// toString()이 오버라이딩 됨 
	System.out.println(date1);    
	System.out.println(date1.toString()); 

	// 현재 날짜 시간을 표시
	Date date2 = new Date();
	System.out.println("date2 = " + date2);
	System.out.println(date2.toLocaleString()); // 지역

	String strDate = date2.toLocaleString();
	System.out.println(strDate);

	// [문제] Date 클래스 문자열에서 연, 월, 일을 분리해서 출력해보세요
	System.out.println( strDate.substring(0, 4));
	System.out.println( strDate.substring(6, 8));
	System.out.println( strDate.substring(10, 12));

	System.out.println( date2.getYear() + 1900 ); //  연도 : 1900년을 기준으로 한 연도를 반환
	System.out.println( date2.getMonth() + 1 ); // 월 :  0부터 11까지의 값을 반환
	System.out.println( date2.getDate()); // 일
	System.out.println( date2.getDay());  // 요일 (0 : 일요일)

	System.out.println( date2.getTime());   // 현재 시간을 밀리초 단위로 반환합니다. 이는 Epoch Time을 기준
	System.out.println( System.currentTimeMillis());   // 위와 같음

	// 생성
	Date date3 = new Date(2024-1900, 10-1, 0);
	// date를 0으로 주게 된다면? 이전 달의 마지막 날이 출력
	System.out.println(date3.toLocaleString());
	}
}


📌 java.util.Calendar 클래스

1. Calendar 클래스의 기본 개념

  • 추상 클래스이기 때문에 직접 객체를 생성할 수 없으며, getInstance() 메서드를 사용하여 하위 클래스의 인스턴스를 얻습니다.
  • 날짜와 시간을 필드 단위로 조작할 수 있으며, 연도, 월, 일, 시, 분, 초 등 개별적으로 설정하거나 가져올 수 있습니다.
  • 달력 시스템을 지원하며, GregorianCalendar(그레고리력)가 기본 구현체입니다.
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {
    
	Calendar calendar = Calendar.getInstance();  // 현재 날짜와 시간 가져오기
    
	int year = calendar.get(Calendar.YEAR);      // 연도 가져오기
	int month = calendar.get(Calendar.MONTH);    // 월 가져오기 (0부터 시작)
	int day = calendar.get(Calendar.DAY_OF_MONTH); // 일 가져오기
	int hour = calendar.get(Calendar.HOUR_OF_DAY); // 시간 가져오기 (24시간 형식)
int minute = calendar.get(Calendar.MINUTE);  // 분 가져오기

	System.out.println("Year: " + year);
	System.out.println("Month: " + (month + 1));  // 월은 0부터 시작하므로 1을 더해줌
	System.out.println("Day: " + day);
	System.out.println("Hour: " + hour);
	System.out.println("Minute: " + minute);
	}
}

2. Calendar의 상수 필드

Calendar 클래스는 날짜와 시간을 상수 필드로 정의해 놓고 있습니다. 예를 들어, 연도, 월, 일, 시간, 분, 초와 관련된 상수들을 제공합니다.

  • Calendar.YEAR: 연도
  • Calendar.MONTH: 월 (0 ~ 11: 0 = 1월, 11 = 12월)
  • Calendar.DAY_OF_MONTH: 일
  • Calendar.HOUR: 12시간 형식의 시간
  • Calendar.HOUR_OF_DAY: 24시간 형식의 시간
  • Calendar.MINUTE: 분
  • Calendar.SECOND: 초
  • Calendar.MILLISECOND: 밀리초

3. Calendar 클래스의 메서드

1) 날짜/시간 필드 설정

Calendar 객체는 특정 날짜나 시간으로 설정할 수 있습니다. set() 메서드를 사용해 연도, 월, 일 등을 직접 설정합니다.

  • set(int field, int value): 특정 필드를 설정합니다. 예를 들어, 연도, 월, 일, 시간을 설정할 수 있습니다.
  • 월 설정 시 주의: **Calendar.MONTH**0부터 시작하므로, 12월은 Calendar.DECEMBER 또는 11로 설정해야 합니다.

2) 날짜/시간 더하기

날짜나 시간을 더하거나 빼는 기능은 add() 메서드를 통해 제공합니다.

  • add(int field, int amount): 특정 필드에 값을 더하거나 뺍니다. 음수를 전달하면 해당 값만큼 감소합니다.
  • 이 메서드를 사용하면, 월말이나 연도 말 등의 경계를 넘는 경우도 자동으로 계산됩니다.
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {

		Calendar calendar = Calendar.getInstance();

		// 날짜를 2024년 12월 25일로 설정
		calendar.set(Calendar.YEAR, 2024);
		calendar.set(Calendar.MONTH, Calendar.DECEMBER);  // 11 = 12월
		calendar.set(Calendar.DAY_OF_MONTH, 25);

		System.out.println(calendar.getTime());  // 설정된 날짜 출력    
	}
}
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {

		Calendar calendar = Calendar.getInstance();

		// 현재 날짜에서 10일 더하기
		calendar.add(Calendar.DAY_OF_MONTH, 10); 
		System.out.println("10일 후: " + calendar.getTime()); 

		// 현재 날짜에서 2개월 빼기  
		calendar.add(Calendar.MONTH, -2); 
		System.out.println("2개월 전: " + calendar.getTime()); 
	}
}

3) 날짜 비교

Calendar 객체의 날짜를 비교할 때는 before(), after() 등의 메서드를 사용할 수 있습니다.

  • before(Calendar when): 해당 날짜가 인자로 전달된 날짜보다 이전인지 확인합니다.
  • after(Calendar when): 해당 날짜가 인자로 전달된 날짜보다 이후인지 확인합니다.
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();

// 5일 후 날짜 설정
calendar2.add(Calendar.DAY_OF_MONTH, 5);

System.out.println(calendar1.before(calendar2));  // true (현재 날짜는 5일 후보다 이전)
System.out.println(calendar1.after(calendar2));   // false (현재 날짜는 5일 후보다 이후가 아님)

3. Calendar 클래스 사용시 주의할 점

  • 월 값이 0부터 시작하는 등 몇 가지 혼란스러운 부분이 있으며, 시간대 처리가 불편합니다.

<수업코드>

package com.util1;

import java.util.Calendar;

public class CalendarEx01 {
	public static void main(String[] args) {
    
		Calendar calendar = Calendar.getInstance(); 
		System.out.println(calendar);  
		System.out.println(calendar.get(Calendar.YEAR)); 
		System.out.println(calendar.get(Calendar.MONTH)); 
		System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); 
		System.out.println(calendar.get(Calendar.DAY_OF_WEEK));


// [문제] Calendar 클래스를 활용해서 한글로 요일을 출력해보세요.
		String[] weekNames = {"일", "월", "화", "수", "목", "금", "토"}; 
		System.out.println(weekNames[calendar.get(Calendar.DAY_OF_WEEK) - 1]);   
        
		System.out.println(calendar.getTimeInMillis());

// 그달의 마지막 날 
		System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); // 그 달의 마지막 날
		System.out.println(calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); // 그 달의 첫 날	
	}
}

<달력 출력 코드>

package com.util1;

import java.util.Calendar;

public class CalendarEx03 {
	public static void main(String[] args) {
    
		int year = 2024;  
		int month = 10;  // 10월

		Calendar startCal = Calendar.getInstance();

		// 1일 정보
		startCal.set(year, month - 1, 1);
		
		// 마지막 날 정보
		int endDate = startCal.getActualMaximum(Calendar.DAY_OF_MONTH);

		// 요일
		int startDayOfWeek = startCal.get(Calendar.DAY_OF_WEEK);

		// 달력 출력
	    System.out.println(" SU MO TU WE TH FR SA");
		for (int i = 1; i < startDayOfWeek; i++) {
			System.out.print("   ");  // 자릿 수를 위함
}

		// i : 달력디자인, n: 날짜
		for (int i = 1, n = startDayOfWeek; i <= endDate; i++, n++) {
			System.out.print((i < 10) ? "  " + i : " " + i);
            
			if (n % 7 == 0) {
			System.out.println();
			}
		}
	}
}

0개의 댓글

관련 채용 정보