Java Date - Instant 기계의 시간
Instant 클래스는 UTC 기준으로 시간의 한 지점을 나타낸다. Instant 날짜와 시간을 나노초 정밀도로 표현하며 1970년 1월 1일 0시 0분 0초 기준으로 경과한 시간으로 계산
Instant 내부는 초 데이터만 들어있으므로 날짜와 시간 계산 사용에 적합하지 않을 수 있다.
Instant 클래스 내부 필드
public final class Instant ... {
private final long seconds;
private final int nanos;
}
seconds 멤버 필드를 확인할 수 있다. utc 기준으로 경과한 시간을 seconds 필드로 표기된다.
- UTC 기준 1970년 1월 1일 0시 0분 0초 -> seconds 필드의 값은 0이다.
- UTC 기준 1970년 1월 1일 0시 0분 22초 -> seconds 필드의 값은 22이다.
- UTC 기준 1970년 1월 1일 0시 2분 22초 -> seconds 필드의 값은 142이다.
Epoch 시간
Epoch Time (에포크 시간) 유닉스 타임스탬프로 컴퓨터 시스템에서 시간을 나타내는 것이 있다. 1970년 1월 1일 00:00:00 UTC으로부터 현재까지의 경과된 시간을 초단위로 표기한 것으로 시간대에 영향을 받지 않는 절대적인 시간 표현이다.
Instant 클래스를 다룬다는 것은 Epoch 시간을 다루는 것과 마찬가지이다.
Instant 특징
장점
- 시간 독립성
- UTC 기준으로 하므로 시간대에 영향을 받지 않아 전 세계 동일한 시점을 가리킨다.
- 고정된 기준
- 1970년 1월 1일 UTC 기준으로 하여 시간 계산 및 비교가 명확해 일관되게 표현할 수 있다.
단점
- 직관적이지 않음. 사용자 친화적이지 않음
- 기계 및 장치들의 시간처리로만 사용하나 사람이 읽고 이해에는 직관적이지 않다.
- 날짜와 시간 계산에 필요한 기능이 부족
- 시간대 정보 없음
- 시간대 정보가 포함되어 있지 않아 특정 지역의 날짜와 시간으로 변환 시 추가 작업을 요구한다.
로그 기록에 국제 표준식 기준으로 데이터베이스로 로그를 기록한다. 이때 발생되는 트랜잭션과 서버 간의 시간을 모두 맞춰야한다. 이 경우 Instant 클래스에서 사용되는 UTC 기준으로 삼는게 적합하다.
Insant 용도
- 국제적인 시간을 기준으로 삼을 때 필요
- UTC 기준으로 하는 Instant 는 일관된 시점으로 표현하므로 적합하다.
- 일관된 시간을 요구하는 데이터베이스에서 자주 사용된다.
- 로그 기록 트랜잭션 타임스탬프 서버 간의 시간 동기화
- 시간대 변화가 일어나지 않는 계산
- 시간대의 변화가 필요하지 않은 순수한 시간의 흐름을 다룬다면 Instant 클래스가 적합하다. 시간대 변환의 복잡성 없이 순수한 시간 계산을 한다.
- 만약 다른 나라의 사용자라면 Instant UTC 시간을 전달해 클라이언트가 복잡한 연산해야 한다.
- 데이터 저장 과 교환
- 데이터베이스의 날짜와 시간을 기록하거나 다른 시스템 간 날짜와 시간 정보 교환 시 Instant 클래스를 사용하면 동일한 기준점을 가리켜 사용함으로 일관성을 유지한다.
일반적인 날짜 시간는 LocalDateTime, ZonedDateTime 클래스가 적합하며 앞서 설명한 Instant 예는 특별한 경우에 속하여 사용된다.
Instant 클래스
now
Instant iNow = Instant.now();
System.out.println(iNow);
2025-06-23T04:11:18.211302400Z
본인의 운영체제가 Asia/Seoul 13시 11분을 가리키는데, 출력에는 UTC +9 시간이 빠진 것을 볼 수 있다.
ofEpochSecond - 유닉스 타임스탬프 기준으로 입력하기
Instant epoch = Instant.ofEpochSecond(0);
System.out.println(epoch);
1970-01-01T00:00:00Z
Instant epoch = Instant.ofEpochSecond(142);
System.out.println(epoch);
1970-01-01T00:02:22Z
plusSeconds - 시간 계산하기 (더하기)
Instant epoch = Instant.ofEpochSecond(142);
System.out.println(epoch);
Instant plusepoch = epoch.plusSeconds(3600);
System.out.println(plusepoch);
1970-01-01T00:02:22Z
1970-01-01T01:02:22Z
getPochSecond - 에포크 날짜로 조회하기
Instant epoch = Instant.ofEpochSecond(142);
System.out.println(epoch);
Instant plusEpoch = epoch.plusSeconds(3600);
System.out.println(plusEpoch);
long getEpoch = plusEpoch.getEpochSecond();
System.out.println(getEpoch);
1970-01-01T00:02:22Z
1970-01-01T01:02:22Z
3742
Instant 정리
- 기계 중심의 UTC 기준 으로 지정됨
- 에포크 시간으로 흐른 시간을 초 단위로 저장함
- 전 세계 모든 서버 시간을 맞출 수 있다. UTC 기준이므로 한국, 미국 간의 복잡한 존 타임 연산 없음
- 서버 로그, epoch 시간 기반의 데이터 저장 및 두 시간의 차이를 계산하는 용도
- 초 단위 간단한 연산만 가능하므로 복잡한 연산 불가
- 날짜와 시간 계산에는 LocalDateTime, ZonedDateTime 사용