![[JAVA] 날짜와 시간 - LocalDate, LocalTime](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpRo4U%2FbtsHS7oPZSQ%2Fp6UrMW70b7IhpQr43vPlc1%2Fimg.png)
날짜와 시간 개념 및 이론
날짜와 시간의 계산은 단순하게 생각하면 쉽지만, 실제로는 윤년, 각 달의 일수, 썸머타임 등 여러가지 요건과 환경을 고려해야하기때문에 매우 복잡하다.
고려할 요소
- 일광 절약 시간(썸머타임)
- 타임존 계산: 각 타임존은 UTC로부터의 시간차이로 정의
- GMT: 처음 세계 시간을 만들 때 영국런던에 있는 그리니치 천문대를 기준으로 태양이 그리니치 천문대를 통과할 때를 정오로 한다.
- UTC: 세계협정시로 GMT보다 정밀한 시간측정을 단위로하며 개념자체는 유사하다
LocalDate, LocalTime, LocalDateTime
LocalDate: 날짜만 표현할 때 사용하며 년, 월, 일을 다룬다
Ex) 2013-11-21
LocalTime: 시간만을 표현할 때 사용하며 시, 분, 초를 다루며 초는 밀리초, 나노초 단위도 포함할 수 있다
Ex) 08:20:30.213
LocalDateTime: LcalDate와 LocalTime을 합한 개념이다
Ex) 2013-11-21T08:20:30.213
LocalDate
LocalDate nowDate = LocalDate.now();
LocalDate ofDate = LocalDate.of(2013, 11, 21);
System.out.println("mowDate = " + nowDate);
System.out.println("ofDate = " + ofDate);
LocalDate plusDays = ofDate.plusDays(5);
LocalDate plusYears = ofDate.plusYears(3);
System.out.println("plusDays = " + plusDays);
System.out.println("plusYears = " + plusYears);
//실행결과
mowDate = 2024-05-31
ofDate = 2013-11-21
plusDays = 2013-11-26
plusYears = 2016-11-21
- now(): 현재 시간을 생성한다.
- of(): 입력한 날짜를 생성한다. (년,월,일 입력)
- plusXXX(): 특정 날짜를 더한다
- minusXXX(): 특정 날짜를 뺀다
===모든 날짜 클래스는 불변객체이기 때문에 값의 변경이 발생할 경우 새로운 객체를 생성해서 반환받아야한다===
LocalTime
LocalTime now = LocalTime.now();
LocalTime ofTime = LocalTime.of(9, 10, 30);
System.out.println("now = " + now);
System.out.println("ofTime = " + ofTime);
LocalTime plusTime = ofTime.plusHours(3);
System.out.println("plusTime = " + plusTime);
//실행결과
now = 20:53:06.456363
ofTime = 09:10:30
plusTime = 12:10:30
- 주요 메서드는 LocalDate와 매우 유사하다.
LocalDateTime
LocalDateTime클래스는 LcalDate와 LocalTime을 내부에 포함하고있다.
public class LocalDateTime {
private final LocalDate date;
private final LocalTime time;
}
LocalDateTime nowDt = LocalDateTime.now();
System.out.println("nowDt = " + nowDt);
LocalDateTime ofDt = LocalDateTime.of(2016, 7, 15, 2, 10, 1);
System.out.println("ofDto = " + ofDt);
LocalDate localDate = ofDt.toLocalDate();
System.out.println("localDate = " + localDate);
LocalTime localTime = ofDt.toLocalTime();
System.out.println("localTime = " + localTime);
LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);
System.out.println("localDateTime2 = " + localDateTime2);
LocalDateTime localDateTime = ofDt.plusDays(1000);
System.out.println("localDateTime = " + localDateTime);
LocalDateTime localDateTime1 = ofDt.plusYears(1);
System.out.println("localDateTime1 = " + localDateTime1);
System.out.println("현재 날짜시간이 지정 날짜시간보다 이전인가? = " + nowDt.isBefore(ofDt));
System.out.println("현재 날짜시간이 지정 날짜시간보다 이후인가? = " + nowDt.isAfter(ofDt));
System.out.println("현재 날짜시간과 지정 날짜시간이 같은가? = " + nowDt.isEqual(ofDt));
//실행결과
nowDt = 2024-05-31T20:59:34.875384
ofDto = 2016-07-15T02:10:01
localDate = 2016-07-15
localTime = 02:10:01
localDateTime2 = 2016-07-15T02:10:01
localDateTime = 2019-04-11T02:10:01
localDateTime1 = 2017-07-15T02:10:01
현재 날짜시간이 지정 날짜시간보다 이전인가? = false
현재 날짜시간이 지정 날짜시간보다 이후인가? = true
현재 날짜시간과 지정 날짜시간이 같은가? = false
- 분리
- 날짜와 시간을 toXXX()메서드로 분리할 수 있다
- 결합
- LocalDateTime.of(날짜,시간)메서드를 통해 날짜와 시간을 결합한다.
- 비교
- isEqual
- Equal
[!NOTE] isEqual vs equal
isEqual()메서드는 단순히 비교 대상이 시간적으로 같기만하면 true를 반환하다. 객체가 다르고 타임존이 다르더라도 시간이 같으면 true를 반환한다. (세계시간포함)euqals()메서드는 객체의 타입, 타임존 등등 내부 데이터의 모든 구성요소가 같아야 true를 반환한다.
Instant - 기계중심의시간
UTC(협정 세계시)를 기준 즉, 1970년 1월 1일 0시 0분 0초를 기준으로부터 경과한 시간을 나노초 단위로 정밀하게 알려준다
날짜와 시간을 계산에 사용할 때는 적합하지 않다.
private final long seconds;
private final int nanos;
장점
- 시간대 독립성:
Instant
는 UTC를 기준으로 하므로 시간대에 영향을 받지 않는다. 이는 절대적인 시간으로 전 세계 어디서나 동일한 시점을 가리키는데 유용하다. - 고정된 기준점: 모든
Instant
는 1970년 1월 1일 UTC를 기준으로 하기 때문에, 시간 계산 및 비교가 명확하고 일관된다
단점
- 사용자 친화적이지 않음:
Instant
는 기계적인 시간 처리에는 적합하지만, 사람이 읽고 이해하기에는 직관적이지 않다. - 시간대 정보 부재:
Instant
에는 시간대 정보가 포함되어있지 않아, 특정 지역의 날짜와 시간으로 변환하려면 추가적인 작업이 필요하다.
사용예시
- 전 세계적인 시간 기준 필요시
- 시간대 변환없이 시간계산 필요시
- 데이터 저장 및 교환: DB날짜와 시간정보를 저장하거나 다른 시스템과 날짜와 시간정보를 교환할때
Duration, Period
===두 날짜 사이의 간격 즉, 시간의 간격(기간)을 표현하는데 사용되는 클래스이다===
- Amount of time(시간의 양)
Period
- 두 날짜 사이의 간격을 년, 월, 일 단위로 나타낸다
- 시간의 기간을 표현
- Ex) 기념일이 183일 남았어
- getYears(), getMonths(), getDays()
import java.time.LocalDate;
import java.time.Period;
public class PeriodMain {
public static void main(String[] args) {
//10일이라는 시간의 양
Period period = Period.ofDays(10);
System.out.println("period = " + period);
LocalDate localDate = LocalDate.of(2030, 1, 1);
LocalDate plusDate = localDate.plus(period);
System.out.println("localDate = " + localDate);
System.out.println("plusDate = " + plusDate);
LocalDate startDate = LocalDate.of(2023, 1, 1);
LocalDate endDate = LocalDate.of(2023, 4, 2);
Period resultDate = Period.between(startDate, endDate);
System.out.println(resultDate.getYears() + "년" + resultDate.getMonths() + "개월" +
resultDate.getDays() + "일");
}
}
Duration
- 두 시간 사이의 간격을 시, 분, 초 단위로 나타낸다
- Ex) 라면을 끓이는 시간은 3분이야
- toHours(), toMinutes(), getSeconds(), getNano()
Duration
클래스의 시간, 분을 얻는 메서드가 toXXX인 이유는 Duration안에 데이터는 사실 초단위로 되어있어서 해당초를 계산하여 반환하기때문에 toHours, toMinutes라는 메서드이름이 붙게 된 것이다. 초를 얻는 getSeconds()메서드는 get으로 시작된다는 것을 확인할 수 있다.
import java.time.Duration;
import java.time.LocalTime;
public class DurationMain {
public static void main(String[] args) {
Duration duration = Duration.ofMinutes(30);
System.out.println("duration = " + duration);
LocalTime localTime = LocalTime.of(2, 30);
LocalTime plusTime = localTime.plus(duration);
System.out.println("localTime = " + localTime);
System.out.println("plusTime = " + plusTime);
LocalTime startTime = LocalTime.of(16, 20);
LocalTime endTIme = LocalTime.of(18, 20);
Duration resultTime = Duration.between(startTime, endTIme);
System.out.println("resultTime = " + resultTime);
}
}
인프런 - 김영한
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1#
'Language > Java' 카테고리의 다른 글
[JAVA - 자료구조] LinkedList (1) | 2024.06.09 |
---|---|
[JAVA] 익명 클래스 (1) | 2024.06.09 |
[JAVA - 자료구조] ArrayList (1) | 2024.06.07 |
[JAVA] 중첩 클래스 (중첩 클래스 ,정적 중첩 클래스, 지역 클래스) (0) | 2024.06.03 |
[JAVA] 다형성 (0) | 2024.06.02 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!