날짜, 시간
Date, Calendar, time
Date -> Calendar-> java.time 패키지 순서로 발전해왔다.
- Calendar: 추상클래스이기 때문에 직접 객체를 생성할 수 없고, 메서드를 통해 완전히 구현된 클래스의 인스턴스를 얻어야 한다.
1
Calendar cal = Calendar.getInstance();
** 메서드는 필요 시 검색
java.time 클래스
- LocalDate: 날짜을 표현할 때
- LocalTime: 시간을 표현할 때
- LocalDateTime: 날짜&시간
- ZonedDateTime: 시간대
- Period: 날짜간의 차이
- Duration: 시간간의 차이
java.time 패키지에 속한 클래스의 객체를 생성하는 기본적인 방법
- now() : 현재 날짜와 시간을 저장하는 객체
- of() : 임의의 시각
1
2
3
LocalDate date = LocalDate.now();
LocalDate date = LocalDate.of(2015, 11, 23);
LocalTime time = LocalTime.of(23, 59, 59);
1
LocalDate birthDate = LocalDate.parse("1999-12-31"); // String을 변환한다. 1999년 12월 31일로 변환.
**메서드
- getYear()
- getMonthValue()
- getDayOfMonth()
- getHour()
- getMinute()
- isAfter()
- isBefore()
- isEqual() 등등이 있다.
**일부 값의 변경
1
2
date = date.withYear(2000);
time = time.withHour(12);
**Instant는 에포크타임부터 경과된 시간을 나노초 단위로 표현한다. 단일 진법으로만 다루기 떄문에 계산이 쉬운 장점이 있다. 보통 사람이 사용하는 날짜,시간은 여러 진법이 섞여 계산이 어렵다.
1
2
Instant now = Instant.now();
instant now2 = Instant.ofEpochSecond(now.getEpochSecond());
**LocalDateTime, ZonedDateTime
1
2
3
4
5
6
7
8
9
10
11
LocalDate date = LocalDate.of(2015, 12, 12);
LocalTime time = LocalTime.of(12,33,33);
LocalDateTime dt = LocalDateTime.of(date,time);
LocalDateTime dt1 = LocalDateTime.of(2015,12,12,12,33,33);
date = dt.toLocalDate();
time = dt.toLocalTime();
ZoneId zid = ZoneId.of("Asia/Seoul");
ZonedDateTime zdt = dt.atZone(zid);
**TemporalAdjusters는 이번 달의 3번째 금요일은 며칠인지와 같은 날짜계산을 대신 해주는 클래스이다.
1
2
3
4
firstDayOfNextYear() // 다음해의 첫 날
firstlnMonth() // 이번달의 첫번째 ?요일
previous() // 지난 ?요일(당일 미포함)
previousOrSame() // 지난 ?요일(당일 포함)
**Period, Duration
1
2
3
4
5
Period pe = Period.between(date1, date2);
Duration du = Duration.between(time1, time2);
pe.minusYears(1).multipliedBy(2); //1년을 빼고 2배를 곱한다.
du.plusHours(1).diviedBy(60); // 1시간을 더하고 60으로 나눈다.
형식화 클래스
성적처리 프로그램을 작성한다고 가정했을 때 각 점수의 평균을 모두 소수점 2자리로 일정하게 맞춘다거나 날짜를 형식에 맞춰 출력한다거나 하는 것들을 쉽게 해결하도록 하는 클래스.
DecimalFormat
형식화 클래스 중 숫자를 형식화 하는데 사용된다. DecimalFormat을 이용하면 숫자데이터를 정수, 부동소수점, 금액 등의 다양한 형식으로 표현할 수 있고, 반대로 일정한 형식의 텍스트 데이터를 숫자로 쉽게 변환할 수도 있다.
기호 | 의미 | 패턴 | 결과 |
---|---|---|---|
0 | 10진수 | 0 | 12345678 |
0 | 10진수 | 0.0 | 1234567.9 |
0 | 10진수 | 00000000.0000 | 001234567.8900 |
# | 10진수 | # | 12345678 |
. | 단위구분자 | #.###.## | 1,234,567.89 |
- | 음수부호 | #.#- | 1234567.9- |
1
2
3
double num = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#");
String result = df.format(num);
SimpleDateFormat
기호 | 의미 | 보기 |
---|---|---|
G | 연대 | AD |
y | 연도 | 2023 |
M | 월 | 10, 10월, OCT |
w | 년의 몇번째 주(1~53) | 50 |
W | 월의 몇번째 주 | 4 |
D | 년의 몇번째 일 | 362 |
d | 월의 몇번째 일 | 31 |
E | 요일 | 월 |
H | 시간 | 20 |
m | 분 | 34 |
s | 초 | 43 |
z | Time zone | GMT+9:00 |
1
2
3
4
5
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
new SimpleDataFormat("오늘은 올 해의 D번째 날입니다.");
new SimpleDataFormat("yyyy/MM/dd E요일");
String result = df.format(today);
ChoiceFormat
특정 범위에 속하는 값을 문자열로 반환해준다. 연속적 또는 불연속적인 범위의 값들을 처리하는 데 있어 if문이나 switch문은 적절하지 못한 경우가 많다.
1
2
3
4
5
6
7
8
9
10
11
double[] limits = {60, 70, 80, 90};
String[] grades = {"D", "C", "B", "A"}; // 이 때 limits, grades의 개수는 맞아야 함.
String pattern = "60#D|70#C|80<B|90#A"; // #은 경계에 포함이 되고 < 는 포함되지 않음 따라서 80은 C임.
int[] scores = {100, 95, 88, 70, 77, 52, 60};
ChoiceFormat form = new ChoiceFormat(limits, grades);
for(int i = 0; i < scores.length; i++){
System.out.println(scores[i] + ":" + form.format(scores[i]);
}
MessageFormat
MessageFormat은 데이터를 정해진 양식에 맞게 출력할 수 있도록 도와준다. 데이터가 들어갈 자리를 마련해 놓은 양식을 미리 작성하고 프로그램을 이용해 다수의 데이터를 같은 양식으로 출력할 때 사용하면 좋다.
예를 들어 고객들에게 안내문을 출력시 이름같은 데이터만 바뀌어야 할 때 이용할 수 있다.
1
2
3
4
5
6
7
8
9
String msg = "Name:{0} \n Tel: {1} \n Age: {2}"
Object[][] arguments = {
{"홍길동", "02-123-1234", "27"},
{"홍길순", "02-111-1111", "33"}
};
for(int i = 0; i < arguments.length; i++)
String result = MessageFormat.format(msg, arguments);
System.out.println(result);