본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

JAVA

java.time패키지: 객체생성 now() of() parse()와 인터페이스, 간격을 나타내는 Period Duration

java.time

Date와 Calendar가 가지고 있던 단점을 해소하기 위해 java.time패키지가 추가됨.

https://standout.tistory.com/1224

 

Calendar와 Date, 이를 이용한 날짜/ 일수 출력하기

오래전부터 제공되던 Date클래스를 보완하기 위해 Calendar 클래스가 등장. Calendar와 GregorianCalendar GregorianCalendar는 Calendar를 상속받아 구현한 전세계 공통 그레고리력에 맞게 구현한것. // Calendar를

standout.tistory.com

 

java.time패키지는 4개의 하위 패키지를 가지고있다.

java.time 날짜와 시간

java.time.chrono 달력시스템

java.time.format 날짜와 시간을 형식화

java.time.temporal 날짜와 시간의 필드/단위를 위한

java.time.zone 시간대

 

 

 

 

 

 

기존 Calendar클래스는 변경가능하여 멀티스레드 환경에서 안전하지 못하다.

java.time의 패키지들에 속한 클래스들은 모두 불변하다.

https://standout.tistory.com/1224#code_1703639480375

 

Calendar와 Date, 이를 이용한 날짜/ 일수 출력하기

오래전부터 제공되던 Date클래스를 보완하기 위해 Calendar 클래스가 등장. Calendar와 GregorianCalendar GregorianCalendar는 Calendar를 상속받아 구현한 전세계 공통 그레고리력에 맞게 구현한것. // Calendar를

standout.tistory.com

 

멀티스레드 환경에서는 동시에 여러 스레드가 같은 객체에 접근할 수 있어

변경가능한 객체는 데이터가 잘못될 가능성이 있다. 이를 스레드에 안전하지 않다고 한다.

https://standout.tistory.com/634

 

멀티 프로세스와 멀티 스레드

앞서 프로세스와 스레드에 대해 알아봤다, 필요하다면 다시 복습해보자. https://standout.tistory.com/498 프로세스/스레드 방식 프로세스 방식 매번 새로운 프로세스를 생성하여 처리하는 방식 멀티태

standout.tistory.com

 

 

 

날짜와 시간을 하나로 표현하는 Calendar클래스와 달리, 

java.time패키지에서는 날짜와 시간을 별도의 클래스로 분리해놨다.

시간은 LocalTime, 날짜는 LocalDate, 날짜와 시간이 모두 필요할때는 LocalDateTime, 시간대까지 다뤄야한다면 ZoneDateTime클래스를 사용하자.

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.ZoneId;

public class DateTimeExample {
    public static void main(String[] args) {
        // 현재 날짜를 가져오기
        LocalDate currentDate = LocalDate.now();
        System.out.println("Current Date: " + currentDate);

        // 현재 시간을 가져오기
        LocalTime currentTime = LocalTime.now();
        System.out.println("Current Time: " + currentTime);

        // 현재 날짜와 시간을 가져오기
        LocalDateTime currentDateTime = LocalDateTime.now();
        System.out.println("Current Date and Time: " + currentDateTime);

        // 특정 시간대의 현재 날짜와 시간 가져오기
        ZoneId zoneId = ZoneId.of("America/New_York");
        ZonedDateTime zonedDateTime = ZonedDateTime.now(zoneId);
        System.out.println("Current Date and Time in New York: " + zonedDateTime);
    }
}

 

 

 

 

java.time 객체를 만들땐

현재, 지정된, 문자열로부터의 날짜와 시간 객체를 생성할 수 있다.

now()

LocalDate currentDate = LocalDate.now(); // 현재 날짜
LocalTime currentTime = LocalTime.now(); // 현재 시간
LocalDateTime currentDateTime = LocalDateTime.now(); // 현재 날짜와 시간

of()

LocalDate specificDate = LocalDate.of(2022, 1, 11); // 2022년 1월 11일
LocalTime specificTime = LocalTime.of(12, 30, 0); // 12시 30분 0초
LocalDateTime specificDateTime = LocalDateTime.of(2022, 1, 11, 12, 30, 0); // 2022년 1월 11일 12시 30분 0초

parse()

LocalDate parsedDate = LocalDate.parse("2022-01-11"); // 문자열을 LocalDate로 변환
LocalTime parsedTime = LocalTime.parse("12:30:00"); // 문자열을 LocalTime으로 변환
LocalDateTime parsedDateTime = LocalDateTime.parse("2022-01-11T12:30:00"); // 문자열을 LocalDateTime으로 변환

 

 

 

그리고 이 차이를 표현할 수 있는 클래스가있다.

Period 두 날짜간의 차이

Duration 시간의 차이

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.Duration;
import java.time.Period;

public class DateTimeDifferenceExample {
    public static void main(String[] args) {
        // Period를 사용하여 두 날짜 간의 차이 나타내기
        LocalDate date1 = LocalDate.of(2022, 1, 1);
        LocalDate date2 = LocalDate.of(2022, 1, 15);

        Period period = Period.between(date1, date2);
        System.out.println("Period between date1 and date2: " + period.getYears() + " years, " +
                           period.getMonths() + " months, " + period.getDays() + " days");

        // Duration을 사용하여 두 시간 간의 차이 나타내기
        LocalDateTime dateTime1 = LocalDateTime.of(2022, 1, 11, 12, 30);
        LocalDateTime dateTime2 = LocalDateTime.of(2022, 1, 12, 14, 45);

        Duration duration = Duration.between(dateTime1, dateTime2);
        System.out.println("Duration between dateTime1 and dateTime2: " + duration.toHours() + " hours, " +
                           duration.toMinutes() % 60 + " minutes");
    }
}

 

 

 

LocalDate, LocalTime, LocalDateTime, ZonedDateTime등의 클래스는 모두 

Temproal, TemporalAccessor, TemporalAdjuster 인터페이스를,

Duration과 Period는 TemporalAmount 인터페이스로 구현한다.

인터페이스를 사용함으로써 인터페이스에서 제공하는 메서드만을 사용할 수 있어 세부적인 내용에 의존하지않아

코드를 더 유연하고 변경/확장에 용이하게 된다.

 

 

 

Temporal는 날짜와 시간을 표현하는 클래스들이 구현하는 인터페이스,

현재날짜를 나타내는 LocalDate 객체를 생성해 Temporal타입 변수에 할당했다.

Temporal temporalObject = LocalDate.now();
System.out.println("Temporal example: " + temporalObject);

TemporalAcccessor는 읽기전용의 날짜와 시간의 정보를 제공하는 인터페이스다.

ZonedDateTime을 사용한 객체를 생성해 TemporalAccessor타입 변수에 할당했다.

TemporalAccessor accessorObject = ZonedDateTime.now();
System.out.println("TemporalAccessor example: " + accessorObject);

 

 

 

TemporalAdjuster는 날짜와 시간을 조정하는 인터페이스로

현재날짜를 나타내는 LocalDate 객체를 생성하고 다음 월요일로 조정하는 TemporalAdjuster를 정의했다.

출력문에는 다음 월요일의 날짜가 출력된다.

LocalDate date = LocalDate.now();
TemporalAdjuster nextMonday = temporal -> {
    LocalDate current = LocalDate.from(temporal);
    int daysToAdd = 1 - current.getDayOfWeek().getValue(); // Calculate days until next Monday
    return current.plusDays(daysToAdd);
};
LocalDate nextMondayDate = date.with(nextMonday);
System.out.println("Next Monday: " + nextMondayDate);

 

 

 

TemporalAmount는 일정한 기간이나 간격을 나타내는 인터페이스다.

Duration, 3시간 간격을 나타내는 객체는 시간을 초와 나노초로 표현하고, 

Period, 5일의 간격을 나타내는 객체는 날짜를 일과 주로 표현하기에

Unit 호출시 [Seconds, Nanos], [Days, Weeks]로 출력되게 된다.

또한 각각 수가 음수가 아니기때문에 Negative값이 false로 출력된다.

 public static void main(String[] args) {
        // Duration 객체 생성
        TemporalAmount temporalAmount1 = Duration.ofHours(3);

        // Period 객체 생성
        TemporalAmount temporalAmount2 = Period.ofDays(5);

        // TemporalAmount 메서드 사용
        printTemporalAmountInfo(temporalAmount1);
        //Temporal amount units: [Seconds, Nanos]
	//Is negative: false
        
        printTemporalAmountInfo(temporalAmount2);
        //Temporal amount units: [Days, Weeks]
	//Is negative: false
    }

    static void printTemporalAmountInfo(TemporalAmount temporalAmount) {
        // TemporalAmount 메서드 사용
        System.out.println("Temporal amount units: " + temporalAmount.getUnits());
        System.out.println("Is negative: " + temporalAmount.isNegative());
    }