다연이네

[days21] JDK 1.8 java.time 본문

Java

[days21] JDK 1.8 java.time

 다연  2020. 10. 19. 13:47
반응형

JDK 1.0 Date보다 JDK 1.1 Calendar가 더 많은 기능이 구현된 클래스

JDK 1.8부터는 java.time 패키지 : 날짜, 시간을 다루는 클래스를 가지고 있는 패키지

 

java.time의 4개의 하위 패키지

1) chrono패키지: 표준(ISO)이 아닌 달력 시스템을 위한 클래스들 제공

2) format 패키지: 날짜, 시간을 파싱(변환)하고 형식화하기 위한 클래스들 제공

3) temporal 패키지: 날짜, 시간의 필드와 단위를 위한 클래스들 제공

4) zone 패키지: 시간대(time-zone)와 관련된 클래스들 제공

 

java.time 패키지의 핵심 클래스

1) LocalTime 클래스: 시간클래스

2) LocalDate 클래스: 날짜클래스

3) LocalDateTime = 1) + 2)

4) ZoneDateTime = 3) + TimeZone

 

Calendar는 ZoneDateTime처럼 날짜+시간+타임존(시간대)를 다룬다.
Date와 유사한 클래스로는 Instant클래스(타임존에 있음)가 있다.

(->날짜+시간+초(나노)단위를 다룸)

 

Temporal과 TemporalAmount

1) java.time 패키지의 핵심클래스들은 impleimplements Temporal, TemporalAcessor, TemporalAdjuster

2) Period, Duration 클래스는 implements TemporalAmount

 

TemporalUnit과 TemporalField

1) TemporalUnit: 날짜와 시간의 단위를 정의해 놓은 인터페이스  //얘 타입을 달라 하면
2) ChronoUnit 열거형: TemporalUnit을 구현한 열거형 //얘를 주면 됨

 

1)TemporalField: 년,월,일 등 날짜와 시간의 필드를 정의해 놓은 인터페이스 //얘도 
2)ChronoField: 구현한 클래스 //얘 주면 됨 (업캐스팅 개념)

package review;

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.temporal.ChronoField;

public class Review01 {

	public static void main(String[] args) {
    /*
		 * 일정관리가 없는 프로그램은 없다 ( 항상 다룬다 )
		 * 1. Date (기능 별로 없음)
		 * 2. Calendar 추상클래스 = 그레고리안캘린더라는 자식클래스 가짐
		 * 3. java.time 패키지
		 * 		하위4개 패키지 존재
		 * 			-
		 * 	4. 핵심클래스
		 * 		-LocalTime, LocalDate, LocalDateTime, 타임존,,
		 * 5. TU, TF
		 * 		CU, CF
		 * 		TA
		 * 6. now()생성, of()설정
		 * 		getXXX(), get(field)
		 * 		with(), plusXXX(), plus(), minus()
		 * 		isAfter(), isBefore(), isEqual()
		 * 
		 * 7. Period, Duration
		 * 		static between() ==  until() 기능은 동일
		 * 8. 문자열 -> 날짜/시간 객체로 변환 parse()
		 * 
		 * 
	*/
    
    
		LocalDate now = LocalDate.now();
		LocalTime time = LocalTime.now();
		
		System.out.println(now); //2020-10-19
		System.out.println(time); //13:32:23.770
	
		//년, 월, 일
		int year = now.get(ChronoField.YEAR);
		year = now.getYear();

		int month = now.get(ChronoField.MONTH_OF_YEAR);
		month = now.getMonthValue(); //1~12
		//Month month = now.getMonth(); // JANUARY~DECEMBER
		
		int day = now.get(ChronoField.DAY_OF_MONTH);
		day =now.getDayOfMonth();
		
		//LocalDate 클래스 사용해서 요일 가져오기
		System.out.println(now.getDayOfWeek()); //MONDAY
			//리턴 자료형이 DatOfWeek, 열거형
		System.out.println(now.get(ChronoField.DAY_OF_WEEK)); //1

		
		//시간, 분, 초
		time.getHour();
		time.get(ChronoField.HOUR_OF_DAY);
		
		time.getMinute();
		time.get(ChronoField.MINUTE_OF_HOUR);
		
		time.getSecond();
		time.get(ChronoField.SECOND_OF_MINUTE);
		
		time.get(ChronoField.MILLI_OF_SECOND); //밀리세컨드
        
        
        // of() 메소드 - 지정된 날짜와 시간으로 객체를 생성할 때는
		//LocalDate ld = LocalDate.of(2020, 9, 15);
		//LocalTime lt = LocalTime.of(hour, minute);
		
		String d ="2020-10-19"; // ->LocalDate 클래스 형변환
		LocalDate ld = LocalDate.parse(d);
		System.out.println(ld); // 2020-10-19 날짜객체로 파싱되어진 것
        
        //필드의 값 변경하기 - with(), plus(), minus()
        
        //현재 날짜 100일 후, 100일 전 날짜
		//plusXXX
		d= d.plusDays(100);
		d= d.minusDays(100);
		//plus
		d=d.plus(100, ChronoUnit.DAYS );
		d=d.minus(100, ChronoUnit.DAYS );
        
        //연도라는 필드를 2019로 변경
		//d = d.withYear(2019);  //방법1
		d= d.with(ChronoField.YEAR, 2019); //방법2
		
		//시간 필드를 3으로 변경
		t= t.withHour(3); //방법1
		t= t.with(ChronoField.HOUR_OF_DAY, 3); //방법2
		
        //**** truncatedTo() ****
        LocalDateTime dt = LocalDateTime.of(birthDate, birthTime);
		System.out.println(dt);
		dt = dt.truncatedTo(ChronoUnit.DAYS) ; // 날짜(일) 뒤에는 모두 제거
		System.out.println(dt);

	}

}

TemporalAdjusters

자주 쓰일만한 날짜 계산들을 대신 해주는 메소드 정의

package review;

import java.time.DayOfWeek;
import java.time.LocalDate;
//import java.time.temporal.TemporalAdjusters; 1번
import static java.time.temporal.TemporalAdjusters.*; //2번


public class Review01 {

	public static void main(String[] args) {
		
		//다음주 월요일이 언제인가?
		LocalDate d = LocalDate.now();
		//LocalDate d2 = d.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); 1번
		LocalDate d2 = d.with(next(DayOfWeek.MONDAY)); //2번
		System.out.println(d2);
		
		
        //다음주 월요일? 오늘 포함
		System.out.println(now.with(nextOrSame(DayOfWeek.MONDAY)));	 //2020-10-19

	}

}

Period와 Duration 클래스의 차이

Period 날짜-날짜
Duration 시간-시간

package review;

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;
import java.time.temporal.ChronoUnit;

public class Review01 {

	public static void main(String[] args) {
		
		LocalDate d1 = LocalDate.of(2014, 1, 1);
		LocalDate d2 = LocalDate.of(2015, 12, 31);
		
		Period p = Period.between(d1, d2);
		System.out.println(p.getYears()); //1
		System.out.println(p.get(ChronoUnit.MONTHS)); //11
		System.out.println(p.get(ChronoUnit.DAYS)); //30
		
        
        
		LocalTime t1 = LocalTime.of(00, 00, 00);
		LocalTime t2 = LocalTime.of(12, 34, 56);
		
		Duration d = Duration.between(t1, t2);
		System.out.println(d.getSeconds()); //45296 (두 시간의 초차이)
		
		LocalTime tmpTime = LocalTime.of(0, 0);
		tmpTime = tmpTime.plusSeconds(d.getSeconds());
		
		System.out.println(tmpTime.getHour()); //12
		System.out.println(tmpTime.getMinute()); //34
		System.out.println(tmpTime.getSecond()); //56
		
	}

}

 

LocalDate - 특정 날짜객체로 파싱

String d = "2020-10-19";
LocalDate ld = LocalDate.parse(d);
System.out.println(ld);

//Date의 경우
Date d = new Date(year, month, date); 

//Calendar의 경우
Calendar c = new GregorianCalendar(year, month, date);

 

반응형
Comments