✔ 시각과 날짜 관련 코드의 작성
Instant 클래스
- 시각은 시간의 어느 한 시점을 뜻하고, 시간은 어떤 시각에서 어떤 시각까지의 사이를 뜻함
- Instant 클래스는 흐르는 시간 속에서의 특정 시점을 표현하기 위한 클래스
- now 메소드를 통해 호출된 시점의 시각 정보를 얻을 수 있으며,
'1970-01-01 00:00:00'을 기준으로 지나온 시간을 초 단위로 계산한 결과를 반환함 - 밀리 초 단위 정밀도를 요구한다면 시각의 차를 표현하기 위한 Duration 클래스를 이용해 1/1000초 단위의 정밀도로 확인
- 이러한 시각 차 정보를 이용해 병렬 스트림 등에서 속도 향상 효과가 있는지 확인할 수 있음
Instant start = Instant.now(); // 현재 시각 정보
System.out.println("시작: " + start.getEpochSecond());
Instant end = Instant.now(); // 현재 시각 정보
System.out.println("끝: " + end.getEpochSecond());
Duration between = Duration.between(start, end); // 두 시각의 차
System.out.println("밀리 초 단위 차: " + between.toMillis());
LocalDate 클래스
- 시각 정보가 생략된 날짜 정보를 표현하기 위한 클래스
- now 메소드를 통해 오늘의 날짜 정보를 얻을 수 있으며,
'년-월-일'와 같은 형태의 문자열로 반환되므로 년도 정보, 월 정보, 일 정보를 각각 가져올 수도 있음 - 또한 기존에 저장된 날짜 정보에서 날짜 값을 변경하여 변경된 날짜 정보를 갖는 인스턴스를 새로 생성해 반환받을 수 있음
- 날짜의 차를 표현하기 위한 Period 클래스도 존재함
- now 메소드를 통해 오늘의 날짜 정보를 얻을 수 있으며,
public int getYear()
public int getMonth()
public int getDayofMonth()
public int getDayofYear()
public LocalDate minusYears(long yearsToSubtract)
public LocalDate minusMonths(long monthsToSubtract)
public LocalDate minusDays(long daysToSubtract)
public LocalDate plusYears(long yearsToAdd)
public LocalDate plusMonths(long monthsToAdd)
public LocalDate plusDays(long daysToAdd)
LocalDate today = LocalDate.now();
LocalDate xmas = LocalDate.of(today.getYear(), 12, 25);
LocalDate eve = xmas.minusDays(1);
Period left = Period.between(today, xmas);
System.out.println("Xmas까지 앞으로 " + left.getMonths() + "월 " + left.getDays() + "일");
LocalTime 클래스
- 시각 정보를 표현하기 위한 클래스
- now 메소드를 통해 현재의 시각 정보를 얻을 수 있으며, '시:분:초'와 같은 형태의 문자열로 반환됨
- 또한 기존에 저장된 시각 정보에서 시각 값을 변경하여 변경된 시각 정보를 갖는 인스턴스를 새로 생성해 반환받을 수 있음
- 시각의 차를 표현하기 위한 Duration 클래스도 존재함
public LocalTime minusHours(long hoursToSubtract)
public LocalTime minusMinutes(long minutesToSubtract)
public LocalTime minusSeconds(long secondsSubtract)
public LocalTime plusHours(long hoursToAdd)
public LocalTime plusMinutes(long minutesToAdd)
public LocalTime plusSeconds(long secondsToAdd)
LocalTime now = LocalTime.now();
LocalTime mt = now.plusHours(2);
mt = mt.plusMinutes(10);
Duration between = Duration.between(now, mt);
LocalDateTime 클래스
- 시각 정보와 날짜 정보를 동시에 표현하기 위한 클래스
- now 메소드를 통해 현재의 날짜와 시각 정보를 얻을 수 있으며, '년-월-일T시:분:초'와 같은 형태의 문자열로 반환됨
- 또한 기존에 저장된 날짜와 시각 정보에서 변경하여 날짜와 시각 정보를 갖는 인스턴스를 새로 생성해 반환받을 수 있음
- 시각의 차를 표현하기 위한 Duration 클래스와 날짜의 차를 표현하기 위한 Period 클래스가 존재함
- 또한 시각과 날짜의 차를 표현하기 위한 isBefore 메소드는 시각이 앞서면 true가 반환되고 그렇지 않으면 false가 반환
반대로 시각이 이후인지에 대한 isAfter 메소드도 존재
public LocalDateTime minusYears(long years)
public LocalDateTime minusMonths(long months)
public LocalDateTime minusDays(long days)
public LocalDateTime plusYears(long years)
public LocalDateTime plusMonths(long months)
public LocalDateTime plusDays(long days)
public LocalDateTime minusHours(long hours)
public LocalDateTime minusMinutes(long minutes)
public LocalDateTime minusSeconds(long seconds)
public LocalDateTime plusHours(long hours)
public LocalDateTime plusMinutes(long minutes
public LocalDateTime plusSeconds(long seconds)
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute)
public static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute)
LocalDateTime dt = LocalDateTime.now();
LocalDateTime mt = dt.plusHours(22);
mt = mt.plusMinutes(35);
LocalDateTime today = LocalDateTime.of(2020, 4, 25, 11, 20);
// LocalDateTime today = LocalDateTime.of(2020, Month.April, 25, 11, 20);
LocalDateTime flight1 = LocalDateTime.of(2020 5, 14, 11, 15);
LocalDateTime flight2 = LocalDateTime.of(2020 5, 13, 15, 30);
LocalDateTime myFlight;
if(flight1.isBefore(flight2))
myFlight = flight1;
else
myFlight = flight2;
Period day = Period.between(today.toLocalDate(), myFlight.toLocalDate());
Duration time = Duration.between(today.toLocalTime(), myFlight.toLocalTime());
✔ 시간대를 적용한 코드 작성 그리고 출력 포맷의 지정
세계의 시간대
- 시차의 약속의 기준이 되는 시각을 가리키는 협정 세계시 (UTC)
- UTC는 경도가 0인 영국 그리니치 천문대의 시각
- 한국의 시간대는 UTC+9 이며 이는 협정 세계시보다 9시간이 빠름을 의미
ZoneId 클래스
- 특정 시간대 정보를 담고 있는 클래스
- 시간대를 고려하여 코드를 작성하려면 특정 시간대 정보를 담고 있는 ZoneId 인스턴스를 생성해야 함
ZoneId paris = ZoneId.of("Europe/Paris");
- 특정 시간대 정보를 확인하기 위해서는 ZoneId의 getAvailableZoneIds 메소드를 호출
ZoneId.getAvailableZoneIds()
.stream()
.filter(s -> s.startsWith("Asia"))
.sorted()
.forEach(s -> System.out.println(s));
ZonedDateTime 클래스
- LocalDateTime 클래스에 인스턴스 별로 시간대 정보를 지정하기 위한 클래스
public static ZonedDateTime now()
public static ZonedDateTime of(LocalDateTime localDateTime, ZoneId zone)
public static ZonedDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneId zone)
ZonedDateTime here = ZonedDateTime.now();
ZonedDateTime paris = ZonedDateTime.of(here.toLocalDateTime(), ZoneId.of("Europe/Paris"));
날짜와 시각 정보의 출력 포맷 지정
- 날짜와 시각 정보를 프로그램의 내용과 상황에 맞게 출력할 수 있어야 함
- DateTimeFormatter 인스턴스에 정보를 담아 format 메소드를 호출하면 전달된 포맷에 맞게 문자열로 구성되어 반환됨
- format 메소드는 LocalDate, LocalTime, LocalDateTime, ZonedDateTime 클래스에 모두 정의되어 있음
- y는 년, M은 월, d는 일의 출력을 의미하며 갯수에 따라 끝에서부터 출력됨
H는 시, m은 분, s는 초의 출력을 의미하며, 두 개일 경우 앞에 0을 붙여서 항상 두 자리 출력이 되도록 유지하여 출력됨
VV는 시간대 ID의 출력을 의미
ZonedDateTime date = ZonedDateTime.of(LocalDateTime.of(2019, 4, 255, 11, 20), ZoneId.of("Asia/Seoul");
DateTimeFormatter fm1 = DateTimeFormatter.ofPattern("yy-M-d");
DateTimeFormatter fm2 = DateTimeFormatter.ofPattern("yyyy-MM-d, H:m:s");
DateTimeFormatter fm3 = DateTimeFormatter.ofPattern("yyyy-MM-d, HH:mm:ss VV");
'Java-Spring > 열혈 Java 프로그래밍' 카테고리의 다른 글
[Java] NIO 그리고 NIO.2 (0) | 2023.08.19 |
---|---|
[Java] I/O 스트림 (0) | 2023.08.19 |
[Java] 스트림 (0) | 2023.08.18 |
[Java] 메소드 참조와 Optional (0) | 2023.08.17 |
[Java] 네스티드 클래스와 람다 (0) | 2023.08.15 |