ZoneId

시간대.  java.time.ZoneId 클래스에 대해 알아보겠습니다.

지역 ID는 {지역}/{도시}로 구성됩니다. 

다음 주소에서 각 정보들을 확인 가능합니다. (https://www.iana.or/time-zones)

 

ZoneDateTime

지정한 시간대에 상대적인 시점으로 LocalDateTime과 ZoneId가 합쳐진 개념이라고 보면 됩니다.

 

ZoneOffset

런던 그리니치 0도 자오선과 시간 값의 차이를 표현할 수 있는 기능들을 제공하는 클래스입니다.

 

예제를 통해서 사용 예시를 확인해보겠습니다.

import java.time.*;
import java.util.TimeZone;

public class Main {
	public static void main(String[] args) {
		ZoneId romeZone = ZoneId.of("Europe/Rome");
		ZoneId seoulZone = ZoneId.of("Asia/Seoul");
		
		ZoneId zoneId = TimeZone.getDefault().toZoneId();
		
		ZonedDateTime zdt1 = date.atStartOfDay(seoulZone);
		LocalDateTime dateTime = LocalDateTime.of(2022, Month.DECEMBER, 22, 23, 45);
		ZonedDateTime zdt2 = dateTime.atZone(seoulZone);
		Instant instant = Instant.now();
		ZonedDateTime zdt3 = instant.atZone(seoulZone);
		
		System.out.println(zdt1);
		System.out.println(zdt2);
		System.out.println(zdt3);

		ZoneOffset newYork = ZoneOffset.of("-05:00");
		OffsetDateTime daOffsetDateTime = OffsetDateTime.of(dateTime, newYork);
		System.out.println(daOffsetDateTime);
    }
}

출력 값

2022-10-22T00:00+09:00[Asia/Seoul]
2022-12-22T23:45+09:00[Asia/Seoul]
2022-11-28T20:54:25.808109400+09:00[Asia/Seoul]
2022-12-22T23:45-05:00

※ UTC = 협정 세계시, GMT(그리니치 표준시)

'Java > Time' 카테고리의 다른 글

TemporalAdjusters와 DateTimeFormatter  (0) 2022.11.28
Instant, Duration, Period  (0) 2022.11.28
LocalDate, LocalTime, LocalDateTime  (0) 2022.11.28

TemporalAdjusters는 복잡한 날짜 조정 기능에 사용하는 기능을 제공하는 클래스입니다.

다음 예제를 통해 사용 예시를 알아보겠습니다.

 

import java.time.*;
import java.time.temporal.ChronoUnit;
import static java.time.temporal.TemporalAdjusters.*;

public class Main {
	public static void main(String[] args) {
    	LocalDate date1 = LocalDate.of(2022, 11, 21);
		LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY));
		LocalDate date3 = date1.with(lastDayOfMonth());
		LocalDate date4 = date1.with(firstDayOfNextMonth());
		
		System.out.println(date1);
		System.out.println(date2);
		System.out.println(date3);
		System.out.println(date4);
    }
}

출력 값

2022-11-21
2022-11-27
2022-11-30
2022-12-01

 

TemporalAdjusters 클래스의 팩토리 메서드

메서드 설명
dayOfWeekInMonth 서수 요일에 해당하는 날짜를 반환하는 TemporalAdjuster를 반환.
firstDayOfMonth 현재 달의 첫번째 날짜를 반환하는 TemporalAdjuster를 반환.
firstDayOfNextMonth 다음 달의 첫번째 날짜를 반환하는 TemporalAdjuster를 반환.
firstDayOfNextYear 내년의 첫번째 날짜를 반환하는 TemporalAdjuster를 반환.
firstDayOfYear 올해의 첫번째 날짜를 반환하는 TemporalAdjuster를 반환.
firstInMonth 현재 달의 첫번째 요일에 해당하는 날짜를 반환하는
TemporalAdjuster를 반환.
lastDayOfMonth 현재 달의 마지막 날짜를 반환하는 TemporalAdjuster를 반환.
lastDayOfNextMonth 다음 달의 마지막 날짜를 반환하는 TemporalAdjuster를 반환.
lastDayOfNextYear 내년 마지막 날짜를 반환하는 TemporalAdjuster를 반환.
lastDayOfYear 올해 마지막 날짜를 반환하는 TemporalAdjuster를 반환.
lastInMonth 현재 달의 마지막 요일에 해당하는 날짜를 반환하는 
TemporalAdjuster를 반환.
nextOrSame 현재 날짜 이후로 지정한 요일이 처음으로 나타나는
날짜는 반환하는 TemporalAdjuster를 반환.
previousOrSame 현재 날짜 이후로 지정한 요일이 이전으로 나타나는
날짜는 반환하는 TemporalAdjuster를 반환.

 

DateTimeFormatter

포매팅과 파싱 전용 java.time.format 패키지 중 DateTimeFormatter 클래스입니다.

정적 팩토리 메서드와 상수를 이용해 쉽게 포매터를 만들 수 있습니다.

예제를 통해 사용 예시를 확인해보겠습니다.

 

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import static java.time.temporal.TemporalAdjusters.*;

public class Main {
	public static void main(String[] args) {
		String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);
		String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
		LocalDate ld1 = LocalDate.parse("20221121", DateTimeFormatter.BASIC_ISO_DATE);
		LocalDate ld2 = LocalDate.parse("2022-11-21", DateTimeFormatter.ISO_LOCAL_DATE);
				
		System.out.println(s1);
		System.out.println(s2);
		
		System.out.println(ld1);
		System.out.println(ld2);
		
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
		LocalTime colonTime = LocalTime.of(17, 59, 59);
		
		System.out.println(formatter.format(colonTime));
    }
}

출력 값

20221022
2022-10-22
2022-11-21
2022-11-21
17:59:59

'Java > Time' 카테고리의 다른 글

ZoneId, ZoneDateTime, ZoneOffset  (0) 2022.11.28
Instant, Duration, Period  (0) 2022.11.28
LocalDate, LocalTime, LocalDateTime  (0) 2022.11.28

Instant 

Instant 클래스는 앞에서 봤던 LocalDate, LocalTime, LocalDateTime 과 달리

기계 관점에서 날짜와 시간을 표현하기 위해 사용합니다.

기계 관점에서는 사람과 달리 날짜와 시간을 구분하기 보다는 하나의 수를 사용하는 것이

계산에 용이하기 때문에 유닉스 에포크 시간(unix epoch time) 1970년 1월 1일 0시 0분 0초 UTC를 기준으로

특정 지점까지 시간을 초로 표현합니다.

팩토리 메서드 ofEpochSecond에 초를 넘겨서 클래스 인스턴스를 생성할수 있으며, 나노초의 정밀도를 제공합니다.

다음 예제를 통해 사용 예시를 확인해보겠습니다.

 

import java.time.*;

public class Main {
	public static void main(String[] args) {
 		Instant i3 = Instant.ofEpochSecond(3);
		Instant i4 = Instant.ofEpochSecond(3, 1_000_000_000);
		Instant i2 = Instant.ofEpochSecond(3, -1_000_000_000);
		
		System.out.println(i3);
		System.out.println(i4);
		System.out.println(i2);   
    }
}

출력 값

1970-01-01T00:00:03Z
1970-01-01T00:00:04Z
1970-01-01T00:00:02Z

 

Duration

두 시간의 객체 사이의 지속 시간을 만들고 표현할수 있습니다.

나노초, 초 단위로 출력이 가능하게 메서드를 제공합니다.

두 개의 LocalTime, LocalDateTime, Instant을 Duration으로 만들 수있습니다.

다음 예제를 통해서 확인해보겠습니다.

 

import java.time.*;
import java.time.temporal.ChronoUnit;

public class Main {
	public static void main(String[] args) {
		LocalTime t1 = LocalTime.of(15, 05, 10);
		LocalTime t2 = LocalTime.of(16, 05, 10);
		
		LocalDateTime dateTime1 = LocalDateTime.of(2022, 12, 1, 12, 00, 00);
		LocalDateTime dateTime2 = LocalDateTime.of(2022, 12, 2, 13, 00, 00);
		
		Duration duration1 = Duration.between(t1, t2);
		Duration duration2 = Duration.between(dateTime1, dateTime2);
		
		Duration fiveMin = Duration.ofMinutes(5);
		Duration sixMin = Duration.of(6, ChronoUnit.MINUTES);
		
		System.out.println(duration1.getSeconds());
		System.out.println(duration2.getSeconds());
		System.out.println(fiveMin);
		System.out.println(sixMin);
    }
}

출력 값

3600
90000
PT5M
PT6M

 

Period

두 시간의 객체 사이의 지속 시간을 만들고 표현할수 있습니다.

년/월/일 단위로 나타냅니다.

Duration의 경우 최대 제어 가능한 단위는 "일" 입니다.

다음 예제를 통해 사용 예시를 확인해보겠습니다.

 

import java.time.*;
import java.time.temporal.ChronoUnit;

public class Main {
	public static void main(String[] args) {
		Period fourDays = Period.ofDays(4);
		Period TwoWeeks = Period.ofWeeks(2);
		Period oneYearTwoMonthsThreeDays = Period.of(1, 2, 3);
		
		System.out.println(fourDays.get(ChronoUnit.DAYS));
		System.out.println(TwoWeeks.get(ChronoUnit.DAYS));
		System.out.println(oneYearTwoMonthsThreeDays.get(ChronoUnit.YEARS));
		System.out.println(oneYearTwoMonthsThreeDays.get(ChronoUnit.MONTHS));
		System.out.println(oneYearTwoMonthsThreeDays.get(ChronoUnit.DAYS));
		
		Period fiveDays = fourDays.plus(Period.ofDays(1));
		System.out.println(fiveDays.get(ChronoUnit.DAYS));
		
		Period threeDays = fourDays.minus(Period.ofDays(1));
		System.out.println(threeDays.get(ChronoUnit.DAYS));
    }
}

출력 값

 

4
14
1
2
3
5
3

 

Duration과 Period 공통 제공 메서드

메서드 정적 메서드 여부 설명
from Y 주어진 Temporal 객체를 이용하여 클래스 인스텉스 생성.
of Y 주어진 구성 요소로 Temporal 객체의
인스턴스 생성.
now Y
시스템 시계로 Temporal 객체 생성.
parse Y 문자열 파싱하여 Temporal 객체 생성.
atOffset N 시간대 오프셋과 Temporal 객체 합침.
atZone N 시간대 오프셋과 Temporal 객체를 합침
format N 지정된 포매터를 이용하여 Temporal
객체를 문자열로 변환.
get N Temporal 객체 상태를 읽어서 반환.
minus N 특정 시간을 뺀 Temporal 객체의 
복사본을 생성.
plus N 특정 시간을 더한 Temporal 객체의 
복사본을 생성.
with N 일부 상태를 바꾼 Temporal 객체의 
복사본을 생성.

 

ChronoUnit

표준 날짜 기간 단위 집합.

이 단위 세트는 날짜, 시간 또는 날짜-시간을 조작하기위한 단위 기반 액세스를 제공합니다. 

 

 

'Java > Time' 카테고리의 다른 글

ZoneId, ZoneDateTime, ZoneOffset  (0) 2022.11.28
TemporalAdjusters와 DateTimeFormatter  (0) 2022.11.28
LocalDate, LocalTime, LocalDateTime  (0) 2022.11.28

자바 1.0에서 java.util.Date 클래스로 날짜와 시간 관련 기능을 제공하였으나

1900년 기준으로 하는 오프셋, 0으로 시작하는 달 인덱스 등 애매한 설계로

유용성이 떨어진다는 이야기가 많았고, 이를 보완할 수 있게 자바 1.1에서 Calandar 클래스가

추가되었으나 Daeformat 같은 일부 기능 들은 Date 클래스에서만 동작한다던 지

DateFormat이 스레드에 안전하지 않다 던지 여러 가지 문제점이 존재하였습니다.

자바 9에서 이를 보완 가능한 java.util.time 패키지가 추가되었고 이에 대해 알아보겠습니다.

 

LocalDate

시간을 제외한 날짜를 표현하는 불변 객체입니다.

어떤 시간대 정보도 포함하지 않습니다.

정적 팩토리 메서드 of로 LocalDate 인스턴스 생성 가능하고

연도, 달, 요일 등을 반환하는 메서드 제공합니다.

예제로 사용 예시를 확인해보겠습니다.

메서드 이름도 굉장히 직관적이고 이전에 비해 사용이 매우 쉬운 편입니다.

import java.time.*;

public class Main {
	public static void main(String[] args) {
		LocalDate date = LocalDate.of(2022, 10, 22);
		LocalDate parseDate = LocalDate.parse("2022-10-22");
		LocalDate today = LocalDate.now();
		int year = date.getYear();
		Month month = date.getMonth();
		DayOfWeek dow = date.getDayOfWeek();
		int len = date.lengthOfMonth();
		boolean leap = date.isLeapYear();
        
        System.out.println(date);
		System.out.println(parseDate);
		System.out.println(today);
		System.out.println(year);
		System.out.println(month);
		System.out.println(dow);
		System.out.println(len);
		System.out.println(leap);
    }
}

출력 값

2022-10-22
2022-10-22
2022-11-28
2022
OCTOBER
SATURDAY
31
false

 

LocalTime

시간 표현이 가능한 객체입니다.

LocalDate 객체와 사용 방법이 유사합니다.

다음 예제를 통해 사용 예시를 확인해보겠습니다.

import java.time.*;

public class Main {
	public static void main(String[] args) {
		LocalTime time = LocalTime.of(15, 56, 59);
        // 포맷이 틀릴 경우 DateTimeParseException 발생.
		LocalTime parseTime = LocalTime.parse("13:56:59"); 
        
		
		int hour = time.getHour();
		int minute = time.getMinute();
		int sec = time.getSecond();
		
		System.out.println(time);
		System.out.println(parseTime);
		
		System.out.println(hour);
		System.out.println(minute);
		System.out.println(sec);	
    }
}

출력 값

15:56:59
13:56:59
15
56
59

 

LocalDateTime

LocalDate와 LocalTime을 갖는 복합 클래스입니다.

날짜와 시간을 모두 표현 가능합니다.

다음 예제를 통해 사용 예시를 확인해보겠습니다.

 

import java.time.*;

public class Main {
	public static void main(String[] args) {
		LocalDateTime dt1 = LocalDateTime.of(2022, Month.DECEMBER, 22, 13, 56, 59);
		LocalDateTime dt2 = LocalDateTime.of(date, time);
		LocalDateTime dt3 = date.atTime(13, 45, 20);
		LocalDateTime dt4 = date.atTime(time);
		LocalDateTime dt5 = time.atDate(date);
		
		LocalDate ldate1 = dt1.toLocalDate();
		LocalTime time1 = dt1.toLocalTime();
		
		System.out.println(dt1);
		System.out.println(dt2);
		System.out.println(dt3);
		System.out.println(dt4);
		System.out.println(dt5);
		System.out.println(ldate1);
		System.out.println(time1);
    }
}

출력 값

2022-12-22T13:56:59
2022-10-22T15:56:59
2022-10-22T13:45:20
2022-10-22T15:56:59
2022-10-22T15:56:59
2022-12-22
13:56:59

 

 

'Java > Time' 카테고리의 다른 글

ZoneId, ZoneDateTime, ZoneOffset  (0) 2022.11.28
TemporalAdjusters와 DateTimeFormatter  (0) 2022.11.28
Instant, Duration, Period  (0) 2022.11.28

+ Recent posts