-
[자바의 정석] 날짜와 시간, 형식화 정리JAVA 2022. 10. 25. 01:01728x90반응형
Calendar
Calendar는 java.util.Calendar로 import 할 수 있으며 추상클래스이다.
- getInstance()를 통해 구현된 객체를 얻을 수 있습니다.
import java.util.Calendar Calendar cal1 = new Calendar(); // Error! 추상클래스는 인스턴스를 생성할 수 없다. Calendar cal2 = Calendar.getInstance(); // OK!
Date와 Calendar간의 변환
// 1. Calendar를 Date로 변환 Calendar cal1 = Calendar.getInstance(); Date d1 = new Date(cal1.getTimeInMillis()); // Date(long date) 생성자 사용 // 2. Date를 Calendar로 변환 Date d2 = new Date(); Calendar cal2 = Calendar.getInstance(); cal2.setTime(d2);
Calendar의 주요 메서드 - get()
Calendar에서는 get()을 통해 날짜와 시간 필드를 가져올 수 있다.
- int get(int field)
Calendar cal = Calendar.getInstance(); // 지금 날짜와 시간을 가진 인스턴스 생성 int thisYear = cal.get(Calendar.YEAR); // 올해가 몇년도인지 확인 int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); // 이 달의 마지막 날은 몇일인지 확인
Calendar에 정의된 필드
Field Name Description YEAR 년 MONTH 월 (0 부터 시작한다.)
예를 들어 1이면 2월이다.WEEK_OF_YEAR 그 해의 몇번째 주
(1월 1일부터 시작)WEEK_OF_MONTH 그 달의 몇번째 주 DATE 일 DAY_OF_MONTH 그 달의 몇번째 일
(DATE랑 같다.)DAY_OF_YEAR 그 해의 몇번째 일 DAY_OF_WEEK 요일 (1~7)
(1은 일요일을 의미한다.)DAY_OF_WEEK_IN_MONTH 그 달의 몇번째 요일 HOUR 시간 ( 0 ~ 11 ) HOUR_OF_DAY 시간 ( 0 ~ 23 ) MINUTE 분 SECOND 초 MILLISECOND 1 / 1000 초 ZONE_OFFSET GMT 기준 시차
※ 한국은 +9AM_PM 0은 오전, 1은 오후 Calendar today = Calendar.getInstance(); System.out.println("올해 년도 " + today.get(Calendar.YEAR)); // 2022 System.out.println("월(0~11, 0은 1월) " + today.get(Calendar.MONTH)); // 9 System.out.println("올 해의 몇번째 주 " + today.get(Calendar.WEEK_OF_YEAR)); // 44 System.out.println("이 달의 몇번째 주 " + today.get(Calendar.WEEK_OF_MONTH)); // 5 System.out.println("이 달의 몇 일 " + today.get(Calendar.DATE)); // 24 System.out.println("이 달의 몇 일 " + today.get(Calendar.DAY_OF_MONTH)); // 24 System.out.println("이 해의 몇 일 " + today.get(Calendar.DAY_OF_YEAR)); // 297 System.out.println("요일 (1~7, 1은 일요일) " + today.get(Calendar.DAY_OF_WEEK)); // 2 System.out.println("이 달의 몇번째 요일 " + today.get(Calendar.DAY_OF_WEEK_IN_MONTH)); // 4 System.out.println("오전 _ 오후 " + today.get(Calendar.AM_PM)); // 0 System.out.println("시간 (0~11) " + today.get(Calendar.HOUR)); // 3 System.out.println("시간 (0~23) " + today.get(Calendar.HOUR_OF_DAY)); // 3 System.out.println("분 (0~59) " + today.get(Calendar.MINUTE)); // 30 System.out.println("초 (0~59) " + today.get(Calendar.SECOND)); // 56 System.out.println("1/1000 초 (0~999) " + today.get(Calendar.MILLISECOND)); // 816 System.out.println("TimeZone(-12 ~ +12) " + today.get(Calendar.ZONE_OF_SET)/(60*60*1000)); // ZONE_OF_SET은 천분의 1초단위로 나오기 때문에 3,600,000으로 나눠서 표시해 주었다. SYstem.out.println("이 달의 마지막 날 " + today.getActualMaximum(Calendar.DATE); // 31
Calendar의 주요 메서드 - set()
Calendar에서 set()을 통해 날짜와 시간을 지정하는게 가능하다.
void set(int field, int value); void set(int year, int month, int date); void set(int year, int month, int date, int hourOfDay, int minute); void set(int year, int month, int date, int hourOfDay, int minute, int second);
날짜를 지정하는 방법을 알아보자
- MONTH(월)은 0부터 시작하는 점을 유의해야한다.
Calendar cal = Calendar.getInstance(); cal.set(2017,7,15); // 2017년 8월 15일 // 하나하나 지정하고 싶다면? cal.set(Calendar.YEAR, 2017); cal.set(Calendar.MONTH, 7); cal.set(Calendar.DATE, 15);
날짜를 지정하는 방법 - 예제
class CalendarTest{ final String[] DAY_OF_WEEK = {"","일","월","화","수","목","금","토"}; Calendar date1 = Calendar.getInstance(); Calendar date2 = Calendar.getInstance(); void dateSet(){ date1.set(2022,10,23); 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)] + "요일 입니다."); long diff = (date2.getTimeInMillis() - date1.getTimeInMillis()) / 1000; System.out.println("date1부터 지금(date2) 까지 " + diff + "초 지났습니다."); System.out.println("일(day)로 계산하면 " + diff/(24*60*60) + "일 입니다."); } public String toString(Calendar date){ return date.get(Calendar.YEAR)+"년"+date.get(Calendar.MONTH)+"월"+date.get(Calendar.DATE)+"일"; } }
시간을 지정하는 방법을 알아보자
Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 22); cal.set(Calendar.MINUTE, 20); cal.set(Calendar.SECOND, 30); // cal의 시간은 지금 22시 20분 30초로 설정되어 있다.
시간을 지정하는 방법 - 예제
class CalendarTest{ final int[] TIME_UNIT = {3600,60,1}; final String[] TIME_UNIT_NAME = {"시간", "분", "초"}; Calendar time1 = Calendar.getInstance(); Calendar time2 = Calendar.getInstance(); void timeSet(){ time1.set(Calendar.HOUR_OF_DAY, 10); time1.set(Calendar.MINUTE, 20); time1.set(Calendar.SECOND, 30); // 10시 20분 30초 time2.set(Calendar.HOUR_OF_DAY, 20); time2.set(Calendar.MINUTE, 30); tiem2.set(Calendar.SECOND, 10); // 20시 30분 10초 System.out.println("time1 : " + time1.get(Calendar.HOUR_OF_DAY) + "시" + time1.get(Calnedar.MINUTE) + "분" + time1.get(Calendar.SECOND) + "초"); System.out.println("time2 : " + time2.get(Calendar.HOUR_OF_DAY) + "시" + time2.get(Calnedar.MINUTE) + "분" + time2.get(Calendar.SECOND) + "초"); long diff = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000; System.out.println("time1과 time2의 차이는 " + diff + "초 입니다."); String tmp = ""; for(int i = 0; i < TIME_UNIT.length; i++){ tmp = tmp + diff/TIME_UNIT[i] + TIME_UNIT_NAME[i]; diff = diff % TIME_UNIT[i]; } System.out.println("시분초로 변환하면 " + tmp + "입니다."); } }
Calendar의 주요 메서드 - clear()
Calendar에서 clear(int field)로 Calendar객체를 초기화 할 수 있다.
- clear()는 Calendar객체의 모든 필드를 초기화 한다.
Calendar cal = Calendar.getInstance(); System.out.println(new Date(cal.getTimeInMillis())); // Mon Oct 24 03:40:39 GMT 2022 cal.clear(); System.out.println(new Date(cal.getTimeInMillis())); // Thu Jan 01 00:00:00 GMT 1970
clear(int field)는 Calendar객체의 특정 필드를 초기화 할 수 있다.
Calendar cal = Calendar.getInstance(); System.out.println(new Date(cal.getTimeInMillis())); // Mon Oct 24 03:41:25 GMT 2022 cal.clear(Calendar.SECOND); cal.clear(Calendar.MINUTE); // 밑에 두개를 같이 해줘야 시간이 초기화 된다. cal.clear(Calendar.HOUR); cal.clear(Calendar.HOUR_OF_DAY); System.out.println(new Date(cal.getTimeInMillis())); // Mon Oct 24 00:00:00 GMT 2022
Calendar의 주요 메서드 - add()
Calendar에서 add()는 특정 필드의 값을 증가 또는 감소 시키며 다른 필드에 영향을 미친다.
Calendar date = Calendar.getInstance(); date.clear(); date.set(2022,7,31); // 2022년 8월 31일 date.add(Calendar.DATE, 1); // 일(day)에 1을 더한다. >> 2022년 9월 1일이된다. date.add(Calendar.MONTH, -8); // 월(month)에서 8을 뺀다 >> 2022년 1월 1일 된다.
Calendar의 주요 메서드 - roll()
Calendar에서 roll()은 특정 필드의 값을 증가 또는 감소 시키며 다른 필드에 영향을 미치지 않는다.
Calendar date = Calendar.getInstance(); date.clear(); date.set(2020,7,31); 2020년 8월 31일 date.roll(Calendar.DATE, 1); // 일(day)에 1을 더한다. >> 2020년 8월 1일 date.roll(Calendar.MONTH, -8); // 월(month)에서 8을 뺀다. >> 2020년 12월 31일
숫자의 형식화 - DecimalFormat
숫자를 다양한 형식(패턴)으로 출력할 수 있게 해준다.
- Integer.parseInt(), Folat.parsefloat()은 콤마(',')가 포함된 문자열을 숫자로 변환하지 못한다.
double number = 1234567.89; DecimalFormat df = new DecimalFormat("#.#E0"); String result = df.format(number); // "1.2E6"
1234567.89를 기준으로 한다. 기호 의미 패턴 결과 0 10진수
값이 없을때는 00
0.0
0000000000.00001234568 (반올림)
1234567.9 (첫째 자리 반올림)
0001234567.8900# 10진수 #
#.#
##########.####1234568 (반올림)
1234567.9 (첫째 자리 반올림)
1234567.89. 소수점 #.# 1234567.9 (첫째 자리 반올림) - 음수 부호 #.#-
-#.#1234567.9-
-1234567.9, 단위 구분자 #,###,##
#,####,##1,234,567.89
123,4567.89E 지수 기호 #E0
0E0
##E0
00E0
####E0
0000E0
#.#E0
0.0E0
0.000000000E0
#.#########E0.1E7
1E6
1.2E6
12E5
123.5E4
1235E3
1.2E6
1.2E6
1.234567890E6
1.23456789E6날짜의 형식화 - SimpleDateFormat
날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.
Date today = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); String result = df.format(today); // 2022-10-24 // 오늘 날짜를 yyyy-MM-dd 형태로 변환해서 반환한다. // 특정 형식으로 되어있는 문자열에서 날짜와 시간을 뽑아 낼수 있다. DateFormat df2 = new SimpleDateFormat("yyyy년 MM월 dd일"); DateFormat df3 = new SimpleDateFormat("yyyy/MM/dd"); Date d = df2.parse("2015년 11월 23일"); // 문자열을 Date로 변환 String result = df3.format(d); // 2015/11/23
기호 의미 보기 (예시) G 연대 (BC, AD) AD y 년도 2022 M 월 (1~12 또는 1월~12월) 10 또는 10월 또는 OCT w 년의 몇번째 주 (1~53) 50 W 월의 몇번째 주 (1~5) 4 D 년의 몇번째 일 (1~365) 120 d 월의 몇번째 일 (1~31) 15 F 월의 몇번째 요일 (1~5) 4 E 요일 화 a 오전 / 오후 (AM, PM) PM H 시간 (0~23) 20 k 시간 (1~24) 13 K 시간 (0~11) 10 h 시간 (1~12) 11 m 분 (0~59) 35 s 초 (0~59) 55 S 천분의 일초 (0~999) 253 z TimeZone(General time zone) GMT + 9:00 Z TimeZone(RFC 822 time zone) +0900 ` escape 문자
(특수문자를표현하는데 사용)없음 Date today = new Date(); // 현재 시간과 날짜를 today에 저장 SimpleDateFormat sdf1, sdf2, sdf3, sdf4; SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9; sdf1 = new SimpleDateFormat("yyyy-MM-dd"); // 2022-10-24 sdf2 = new SimpleDateFormat("``yy년 MMM dd일 E요일"); // ``22년 OCT 24일 Mon요일 sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); // 2022-10-24 08:43:22.837 sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); // 2022-10-24 08:43:22 AM sdf5 = new SimpleDateFormat("오늘은 올해의 D번째 날입니다."); // 297 번째 날 sdf6 = new SimpleDateFormat("오늘은 이달의 d번째 날입니다."); // 24 번째 날 sdf7 = new SimpleDateFormat("오늘은 올해의 w번째 주입니다."); // 44 번째 주 sdf8 = new SimpleDateFormat("오늘은 이달의 W번째 주입니다."); // 5 번째 주 sdf9 = new SimpleDateFormat("오늘은 이달의 F번째 E요일입니다."); // 4 번째 Mon 요일
java.time 패키지
Date와 Calendar의 단점을 보완하기 위해 추가된 패키지 (JDK 1.8 부터) 이다.
- 이 패키지에 속한 클래스들은 모두 불변이다.
java.time 패키지의 핵심 클래스
날짜를 표현할 때는 LocalDate, 시간을 표현할 때는 LocalTime을 사용한다.
- 날짜와 시간을 같이 표현하고 싶다면 LocalDateTime을 사용하면 된다.
- 만약 시간대(time-zone)까지 다뤄야 한다면 ZoneDateTime을 사용하면 된다.
- 날짜간의 차이는 Period, 시간의 차이는 Duration을 사용하면 된다.
- now()는 현재 날짜 시간을, of()는 특정 날짜 시간을 지정하는데 사용된다.
LocalDate today = LocalDate.now(); // 오늘의 날짜 (2022-10-24) LocalTime now = LocalTime.now(); // 현재 시간 LocalDate birthDate = LocalDate.of(1993,3,1); // 1993년3월 1일 LocalTime birthTime = LocalTime.of(23,59,59); // 23시 59분 59초 // 일 단위나 초단위로 지정가능 (1일은 24*60*60) LocalDate birthDate2 = LocalDate.ofYearDay(1993,365); // 1993년 12월 31일 LocalTime birthTime2 = LocalTime.ofSecondDay(86399); // 23시 59분 59초 // parse()로 문자열을 LocalDate나 LocalTime으로 변환할 수 있다. LocalDate birthDate3 = LocalDate.parse("1999-12-31"); // 1999년 12월 31일 LocalTime birthTime3 = LocalTime.parse("23:59:59"); // 23시 59분 59초
728x90반응형'JAVA' 카테고리의 다른 글
Java Scanner 대신 BufferedReader 사용해보기 (0) 2022.11.30 [Java] 성적 조회 프로그램 만들기 (0) 2022.11.03 [자바의 정석] Object, String, StringBuffer 클래스 정리 (2) 2022.10.21 [자바의 정석] 예외처리 (0) 2022.10.19 [자바의 정석] 추상클래스 인터페이스 내부클래스 정리 (1) 2022.10.19