Home 형식화 클래스, java.time
Post
Cancel

형식화 클래스, java.time

날짜, 시간

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을 이용하면 숫자데이터를 정수, 부동소수점, 금액 등의 다양한 형식으로 표현할 수 있고, 반대로 일정한 형식의 텍스트 데이터를 숫자로 쉽게 변환할 수도 있다.

기호의미패턴결과
010진수012345678
010진수0.01234567.9
010진수00000000.0000001234567.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
M10, 10월, OCT
w년의 몇번째 주(1~53)50
W월의 몇번째 주4
D년의 몇번째 일362
d월의 몇번째 일31
E요일
H시간20
m34
s43
zTime zoneGMT+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);
This post is licensed under CC BY 4.0 by the author.