서버 개발을 하다보면 날짜와 시간이 필요한 경우가 많다. 개념은 쉽지만 코드레벨에서는 이해를 정확히 하지 못해 날짜와 시간을 다루는 것은 생각보다 복잡할 수 있다. 대표적으로 복잡한 사례는 (1) 여러 가지 조건(윤년, 썸머타임 등), (2) Token 만료 기한 확인 등이 있다. 실제로 이 로직을 오류를 낸 경험이 있다. 이러한 복잡한 상황을 처리하기 위해 자바의 java.time 패키지와 같은 시간 라이브러리를 사용해야 한다. 오늘은 Time 에 대해서 개념을 이해하기 위한 아주아주 기초 지식을 정리해보고자 한다.
타임존
타임존은 UTC(협정 세계시)를 기준으로 변환되는 시간을 나타낸다. 예를 들어, 한국의 타임존은 Asia/Seoul로, 이는 UTC 기준으로 +09:00이다. 타임존을 통해 각 지역의 시간을 정확히 정의하고 서로의 시간 차이를 계산할 수 있다.
Java. 에서 날짜 및 시간 관련 클래스
자바의 시간 라이브러리는 다양한 날짜 및 시간 관련 클래스를 포함하고 있다.
- LocalDate: 연도, 월, 일을 다룰 수 있는 클래스
- LocalTime: 시, 분, 초를 다룰 수 있는 클래스
- LocalDateTime: 날짜와 시간을 모두 다룰 수 있는 클래스
이러한 클래스는 Local로 시작하는 이유는 세계 시간대를 고려하지 않고, 특정 지역의 날짜와 시간만을 다루기 때문이다.
LocalDate 예제 코드
import java.time.LocalDate;
public class LocalDateExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
System.out.println("오늘 날짜: " + today);
System.out.println("내일 날짜: " + tomorrow);
}
}
Epoch Time
에포크 시간(Epoch Time)은 1970년 1월 1일을 기준으로 경과한 시간을 초 단위로 표현하는 방법이다. 이 방법을 사용하면 각 국가의 시간 규칙에 관계없이 일관된 시간 계산을 제공한다.
예제: Instant 사용하기
import java.time.Instant;
public class EpochExample {
public static void main(String[] args) {
Instant now = Instant.now();
long epochTime = now.getEpochSecond();
System.out.println("현재 에포크 시간(초): " + epochTime);
}
}
시간 간격의 개념
시간 간격을 나타내는 클래스를 사용할 수 있다. 이를 통해 특정 시점의 시간과 시간 간격을 정확하게 다룰 수 있다.
Period: 일, 월, 년 단위로 날짜 간격을 나타내는 클래스
Duration: 초, 밀리초 등의 단위로 시간을 나타내는 클래스
예제: Period와 Duration 사용하기
import java.time.LocalDate;
import java.time.Period;
import java.time.Duration;
public class PeriodDurationExample {
public static void main(String[] args) {
LocalDate startDate = LocalDate.of(2023, 1, 1);
LocalDate endDate = LocalDate.of(2023, 12, 31);
Period period = Period.between(startDate, endDate);
System.out.println("두 날짜 사이의 기간: " + period.getDays() + "일");
Duration duration = Duration.between(Instant.now(), Instant.now().plusSeconds(3600));
System.out.println("60분의 Duration: " + duration.toMinutes() + "분");
}
}
비교 구문 예제코드
import java.time.LocalDate;
public class DateComparisonExample {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2023, 5, 20);
LocalDate date2 = LocalDate.of(2023, 8, 15);
System.out.println("date1이 date2보다 이전인가? " + date1.isBefore(date2));
System.out.println("date1과 date2가 같은 날인가? " + date1.isEqual(date2));
}
}
주요 메서드
- of(): 특정 날짜나 시간을 생성하는 메서드
- now(): 현재 날짜 또는 시간을 생성하는 메서드
- plusXxx(): 년, 월, 일 등을 더하는 메서드
- isBefore(), isAfter(): 다른 날짜 시간과 비교하는 메서드
- isEqual(): 시간적으로 같은지를 비교하는 메서드
- Period.between(), Duration.between(): 시작과 끝 날짜/시간 객체를 인자로 받아서 간격 객체를 반환하는 메서드
마무리
자바의 time 라이브러리는 날짜와 시간을 처리하는 데 필요한 많은 기능을 제공한다. 이러한 클래스를 적절히 활용하면 더욱 정확하고 일관된 시간 계산을 수행할 수 있다. 시간 라이브러리의 사용법을 다 외우기보다는 주요 기능과 접근 방법을 이해하고 필요할 때마다 찾아서 사용하는 것이 좋다.
'Java' 카테고리의 다른 글
Java 에서 Exception (1) | 2025.02.04 |
---|---|
Java 에서 중첩 클래스 (1) | 2025.02.03 |
Java 에서 Enum (1) | 2025.02.02 |
Wrapper 클래스 (0) | 2025.02.02 |
Java 에서 final keyword 란!? (0) | 2025.01.29 |