JAVA/JAVA2

[java2] #32 - Date, Calendar, SimpleDateFormat Class

yoonddo 2022. 11. 17. 22:55

Date Class

날짜 및 시각 정보를 관리하는 클래스로 *java.util.Date에 포함되어있다.

대부분의 메서드가 deprecated로 처리되어 있으므로 현재 사용되지 않지만 기존에 제공되는 API들의 대다수가 Date타입을 사용하고있다.

 

예시

Date d1 = new Date();
System.out.println(d1); //toString() 생략되어 있음(= 오버라이딩)

현재 날짜 및 시각 정보가 Wed Jun 24 16:02:18 KST 2020 형태로 출력되며

EEE MMM dd HH:mm:ss zzz yyyy 패턴을 사용하여 toString() 메서드가 오버라이딩 됨


 

Date d2 = new Date(15000000000L);
System.out.ptintln(d2)

생성자에 long 타입 값을 전달하면 1970년 1월 1일 0시 0분 0초를 기점으로

long 타입 값을 밀리초(1/1000초)로 환산한 현재 시각을 객체로 생성한다.


long gap = d1.getTime();
d2.getTime();
System.out.println("두 객체의 차 : " + gap);
System.out.println("두 객체의 차 : " + (gap / 1000 / 60 / 60 / 24) + "일");

gap : 두 날짜의 차를 (ms)밀리초 단위로 계산한다.

gap / 1000/ 60 / 60 / 24 : 밀리초 단위를 일 단위로 변경한다.

[ 밀리초 -> 초(1/1000) -> 분 (/60 -> 시(60) -> 일(24) ]


 

Date 클래스 객체에서 년, 월, 일, 시, 분, 초를 얻어오려면 get으로 시작하는 메서드를 사용하고, 수정하려면 set으로 시작하는 메서드를 사용해야한다.

예시

System.out.println("년: " +  (date.getYear() + 1900));
System.out.println("월: " +  (date.getMonth() + 1));
System.out.println("일: " +  date.getDate());
System.out.println("요일: " +  date.getDay());		// 일요일 => 0, 월요일 => 1, ..., 토요일 => 6
System.out.println("시: " +  date.getHours());
System.out.println("분: " +  date.getMinutes());
System.out.println("초: " +  date.getSeconds());
System.out.println("===============================================");

date.setYear(2021);
System.out.println("년: " +  date.getYear());
date.setMonth(7);
System.out.println("월: " +  date.getMonth());

Date 클래스는 1900년을 기준으로 날짜를 처리하기 때문에 년을 얻어올 때에는 1900을 더해서 얻어와야 하고

월을 얻어올 때는 1을 더해서 얻어와야 한다. 반대로 저장할 때는 년은 1900을 빼고 월은 1을 빼서 저장한다.

(요일 : 일요일 => 0, 월요일 => 1, ..., 토요일 => 6)

 

결과


Calendar calendar = Calendar.getInstance();
		
System.out.println("년: " + calendar.get(Calendar.YEAR));
System.out.println("월: " + (calendar.get(Calendar.MONTH) + 1));
System.out.println("일: " + calendar.get(Calendar.DATE));
System.out.println("일: " + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("요일: " + calendar.get(Calendar.DAY_OF_WEEK));
System.out.println("시: " + calendar.get(Calendar.HOUR));			// 12시각
System.out.println("시: " + calendar.get(Calendar.HOUR_OF_DAY));	// 24시각
System.out.println("분: " + calendar.get(Calendar.MINUTE));
System.out.println("초: " + calendar.get(Calendar.SECOND));
System.out.println("밀리초: " + calendar.get(Calendar.MILLISECOND));

마찬가지로 Calendar 클래스에서도 get을 사용해 정보를 얻어올 수 있는데,  Date 클래스와는 달리 년도를 구할 때 1900을 더하지 않아도 된다.

 

Date d3 = new Date(2002, 5, 1, 20, 0, 0);
// 2002년 5월 1일 20시 0분 0초로 설정
System.out.println(d3.getYear() + "/" + d3.getMonth() + "/" + d3.getDate());

d3.setYear(2019);
System.out.println(d3.getYear());

한번에 얻어오고 싶을때는 +로 연결해 출력하면 된다.


 

Calendar Class

Calendar Class는 singleton 패턴으로 제작된 클래스라서 new를 사용해 객체를 생성할 수 없다.

Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
System.out.println(calendar.getTime());
System.out.println(System.currentTimeMillis());

long time = System.currentTimeMillis();
		System.out.println(time);

getInstance() 라는 static 메서드로 Calendar 클래스 내부에 미리 생성해놓은 Calendar 클래스 객체를 얻어와 사용한다.

currentTimeMillis()는 1970년 1월 1일 자정부터 이 메소드가 실행되는 순간까지 지난 시간을 밀리(1/1000)초 단위로 얻어온다.

currentTimeMillis() 메소드로 얻어오는 시간은 13자리의 정수이기 때문에 int형 변수가 아닌 long형 변수에 저장해서 사용해야한다.


 

SimpleDateFormat

Date 클래스를 이용하여 현재 날짜를 출력하면 영문으로 된 날짜를 리턴한다. 한글이나 특정 문자열 포맷으로 얻고 싶을 때 SimpleDateFormat 클래스를 이용하면 된다.

  • [SimpleDateFormat (클래스명) = new SimpleDateFormat("출력 서식")]  형식으로 사용한다.
  • [(클래스명).format(날짜 데이터)] 로 날짜 및 시간 서식을 적용한다.
  • format() 메서드의 실행 결과는 문자열로 변경된다.

예시

SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 a h시 mm분 ss초");
System.out.println(sdf.format(date));
SimpleDateFormat sdf2 = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
System.out.println(sdf2.format(calendar.getTime()));
SimpleDateFormat sdf3 = new SimpleDateFormat("yy.MM.dd(E) HH:mm:ss.SSS");
System.out.println(sdf3.format(System.currentTimeMillis()));

결과


SimpleDateFormat 의 패턴생성에 사용되는 기호들

문자 날짜 및 시간 요소  표시 예제
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M Month in year (context sensitive) Month July; Jul; 07
L Month in year (standalone form) Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day name in week Text Tuesday; Tue
u Day number of week (1 = Monday, ..., 7 = Sunday) Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00

 

예시 패턴

날짜 및 시간 패턴 결과
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u" 2001-W27-3


 

주민등록번호를 입력받아 생년월일과 요일 출력하기

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class DateTime3 {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
//		System.out.print("년, 월, 일: ");
//		int year = scanner.nextInt() - 1900;
//		int month = scanner.nextInt() - 1;
//		int day = scanner.nextInt();
//		
//		Date date = new Date(year, month, day);
//		System.out.println(date);
//		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd(E)");
//		System.out.println(sdf.format(date));

//		주민등록번호를 입력받아 생일을 날짜 데이터로 만들기
		System.out.print("주민등록번호: ");
		String junumNo = scanner.nextLine().trim();
		
//		System.out.println(junumNo.substring(0, 2));
//		System.out.println(junumNo.substring(2, 4));
//		System.out.println(junumNo.substring(4, 6));
		
		int year = (junumNo.substring(0, 2).charAt(0) - 48) * 10 + (junumNo.substring(0, 2).charAt(1) - '0');
//		System.out.println(year);
		int month = (junumNo.substring(2, 4).charAt(0) - 48) * 10 + (junumNo.substring(2, 4).charAt(1) - '0');
//		System.out.println(month);
		int day = (junumNo.substring(4, 6).charAt(0) - 48) * 10 + (junumNo.substring(4, 6).charAt(1) - '0');
//		System.out.println(day);
		
		if (junumNo.charAt(6) > '2') {
			year += 100;
		}
		
		Date date = new Date(year, month - 1, day);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd(E)");
		System.out.println(sdf.format(date));
		
	}

}

결과

위 주민등록번호는 예시입니다.

 

위는 두가지 방법으로 출력했는데 각각 변수로 입력받은 생년월일 정보를 바로 저장해 계산 후 출력하는 방법과

주민등록번호 전체를 문자열로 입력받아 다시 정수로 바꿔 출력하는 방법이다. 후자는 아스키코드를 사용해 계산해야하며

2000년대생 부터는 year에 100을 더해야 한다.

 

이때 substring을 사용하는데 substring이란 문자열을 자르는 함수이다.

  • 표현법 : substring(index1, index2)
  • 문자열을 자르기 시작하는 부분부터 끝부분까지 표현하는 방법이다.

예시)

인덱스 번호 0번방 1번방 2번방 3번방 4번방 5번방 6번방
생년월일
예시
9 2 0 4 2 2  
찾을 부분(月)     Start(indext1)   End(index2)    

 즉, subString은 Start부터 End전까지의 문자열을 나타낸다. 그렇기 때문에 출력 될 부분은 04이다.


아스키코드

10진 문자
48 '0'
49 '1'
50 '2'
51 '3'
52 '4'
53 '5'
54 '6'
55 '7'
56 '8'
57 '9'

입력받은 주민등록번호 중 년도인 92를 계산해보면 첫 번째 글자 '9'는 57에서 48을 빼면 9가 나온다.

그 다음 10을 곱해줘 십의자리인 90을 만든다.

그 후 일의 자리인 '2'는 50이고 위 소스코드에선 '0'을 뺐는데 이는 48을 뺀 것과 같다. 두 값을 더하면 92이다. 

Date에 저장될 때엔 년도에 1900이 더해지므로 1900 + 92 해서 1992가 출력되는 것을 확인할 수 있다.

*이 때 주의할 점은 48을 빼지 않으면 틀린 값이 나오기 때문에 꼭 빼줘야 한다.*

 

'JAVA > JAVA2' 카테고리의 다른 글

[java2] #34 - Memo Project  (0) 2022.11.19
[java2] #33 - varargs (가변인자)  (0) 2022.11.19
[java2] #31 - ArrayList (개념/사용법)  (0) 2022.11.15
[java2] #30 - String Class Method  (0) 2022.11.04
[java2] #29 - StringBuilder, StringBuffer  (0) 2022.11.02