Java8부터는 LocalDate와 LocalDateTime이 등장했다. 그전에는 자바 기본 날짜타입인 Date클래스, Calenar클래스를 사용했는데 문제점이 꽤나 많아서 오픈소스인 JodaTime을 통해 문제점들을 피하곤했다. 하지만 Java8에서부터는 더이상 피할 필요가 없도록 LocalDate와 LocalDateTime이 추가되었다.
Date클래스, Calenar클래스 문제점
변하지 않는 객체가 아님
Calenar.OCTOBER 숫자값이 9로 헷갈리게 설정되어있어 문제를 야기함
java.util.Date 클래스
deprecated처리되었지만 이미 작성된 많은 API가 파라미터나 리턴타입으로 Date를 여전히 사용.
publicstatic String getDateString(Calendar c){ int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH)+1; int date = c.get(Calendar.DATE); int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
String day = null; switch(dayOfWeek){ case Calendar.SUNDAY : day = "일"; break; case Calendar.MONDAY : day = "월"; break; case Calendar.TUESDAY : day = "화"; break; case Calendar.WEDNESDAY : day = "수"; break; case Calendar.THURSDAY : day = "목"; break; case Calendar.FRIDAY : day = "금"; break; case Calendar.SATURDAY: day = "토"; break; default : System.out.println("다시입력해주세요"); } return String.format("%d년 %d월 %d일(%s)", year, month, date, day); }
publicstatic String getTimeString(Calendar c){ int hour = c.get(Calendar.HOUR); int minute = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); int amPm = c.get(Calendar.AM_PM); String smPmString = (amPm == Calendar.AM ? "오전":"오후"); return String.format("%d시 %d분 %d초(%s)", hour, minute, second, smPmString); }
publicstaticvoidmain(String[] args){ LocalDate date1 = LocalDate.of(1953, 8, 15); LocalDate date2 = LocalDate.now(); Period p = Period.between(date1, date2); System.out.println(p); System.out.println("몇 년 차이 ? "+ p.getYears()); System.out.println("몇 월 차이 ? "+ p.getMonths()); System.out.println("몇 일 차이 ? "+ p.getDays());
long monDiff = ChronoUnit.MONTHS.between(date1, date2); System.out.println("총 몇 개월 차이 ? "+monDiff);
LocalDateTime dt1 = LocalDateTime.of(2011, 3, 01, 1,1,1); LocalDateTime dt2 = LocalDateTime.of(2020, 3, 01, 1,1,1); Duration d = Duration.between(dt1, dt2); System.out.println(d); System.out.println("getSeconds사용한 몇 초 차이? "+d.getSeconds()); long secDiff = ChronoUnit.SECONDS.between(dt1, dt2); System.out.println("chronounit사용한 몇 초 차이? "+ secDiff); } //출력값 P66Y11M22D 몇 년 차이 ? 66 몇 월 차이 ? 11 몇 일 차이 ? 22 총 몇 개월 차이 ? 803 PT78912H getSeconds사용한 몇 초 차이? 284083200 chronounit사용한 몇 초 차이? 284083200
날짜와 시간 표현
포맷팅 : 객체를 원하는 형태의 문자열로 변환하는 과정. 파싱의 반대.
파싱 : 문자열을 객체로 변경하는 과정. 포맷팅의 반대.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
publicstaticvoidmain(String[] args){ LocalDateTime date = LocalDateTime.of(2011, 2,5,1,11,0); System.out.printf("기본 날짜 출력 : %s%n", date); System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE)); System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE)); //추천 System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_TIME)); System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); System.out.println(date.format(DateTimeFormatter.ISO_ORDINAL_DATE)); System.out.println(date.format(DateTimeFormatter.ISO_WEEK_DATE)); } //출력값 기본 날짜 출력 : 2011-02-05T01:11 20110205 2011-02-05 01:11:00 2011-02-05T01:11:00 2011-036 2011-W05-6
DateTimeFormatter는 다양한 포맷의 출력을 지원하지만 개발자가 원하는 형태의 출력이 아닐 수 있다.