java.time
Date와 Calendar가 가지고 있던 단점을 해소하기 위해 java.time패키지가 추가됨.
https://standout.tistory.com/1224
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
멀티스레드 환경에서는 동시에 여러 스레드가 같은 객체에 접근할 수 있어
변경가능한 객체는 데이터가 잘못될 가능성이 있다. 이를 스레드에 안전하지 않다고 한다.
https://standout.tistory.com/634
날짜와 시간을 하나로 표현하는 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());
}
'JAVA' 카테고리의 다른 글
에포크타임의 표현 Instant, now() ofEpochSecond() 객체생성, toEpochMilli() 밀리초단위의 생성, Date와의 변환방법까지 (0) | 2024.01.12 |
---|---|
LocalDate와 LocalTime: get() getLong()특정필드값 가져오기, with() plus() minus() 변경하기, truncatedTo() 0으로 만들기, isAfter() isBefore() isEqual() 비교하기 (0) | 2024.01.12 |
생일에 따른 연령계산하기 insert, update (0) | 2024.01.08 |
기술등급 계산하기 insert, update (0) | 2024.01.08 |
경력년차 계산하기 insert, update (0) | 2024.01.08 |