Instant 클래스
시각: 시간의 어느 한 시점 / 시간: 어떤 시각에서 시각 까지의 사이
Instant now = Instant.now()
now가 참조하는 인스턴스에는 now 메소드가 호출된 시점의 시각 정보가 담긴다.
import java.time.Duration;
import java.time.Instant;
public class Main {
public static void main(String[] args) {
Instant start = Instant.now();
System.out.println(start.getEpochSecond());
System.out.println();
Instant end = Instant.now();
System.out.println(end.getEpochSecond());
Duration between = Duration.between(start, end);
System.out.println(between);
}
}
Instant start = Instant.now();
System.out.println(start.getEpochSecond());
메소드 호출을 통해 저장된 시각 정보를 반환
Instant start = Instant.now();
시간 측정 대상 문장들이 여기 온다
Instant end = Instant.now();
System.out.println(end.getEpochSecond());
Duration between = Duration.between(start, end);
System.out.println(between);
보다 정밀한 시간 측정을 원한다면 Duration을 사용
순차 스트림
import java.time.Duration;
import java.time.Instant;
import java.util.Arrays;
import java.util.List;
public class Main1 {
public static long fibonacci(long n) {
if (n == 1 || n == 2)
return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(40, 41, 42, 43, 44, 45);
Instant start = Instant.now();
nums.stream()
.map(n -> fibonacci(n))
.forEach(s -> System.out.println(s));
Instant end = Instant.now();
System.out.println(Duration.between(start, end).toMillis());
}
}
병렬 스트림
import java.time.Duration;
import java.time.Instant;
import java.util.Arrays;
import java.util.List;
public class Main2 {
public static long fibonacci(long n) {
if (n == 1 || n == 2)
return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(40, 41, 42, 43, 44, 45);
Instant start = Instant.now();
nums.parallelStream()
.map(n -> fibonacci(n))
.forEach(s -> System.out.println(s));
Instant end = Instant.now();
System.out.println(Duration.between(start, end).toMillis());
}
}
순차 스트림의 속도가 더 빨랐다.
LocalDate 클래스
“날짜 정보를 표현하기 위함”
import java.time.LocalDate;
public class Main3 {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println(today);
LocalDate xmas = LocalDate.of(today.getYear(), 12, 25);
System.out.println(xmas);
LocalDate eve = LocalDate.of(today.getYear(), 12, 24);
LocalDate eve1 = xmas.minusDays(1);
System.out.println(eve1);
}
}
LocalDate today = LocalDate.now();
오늘 날짜 정보를 담은 인스턴스 생성
toString을 통해서 문자열로 반환 함
LocalDate xmas = LocalDate.of(today.getYear(), 12, 25);
LocalDate 인스턴스를 생성하기 위해서 of 메소드를 사용.
getYear의 경우 연도를 반환,
LocalDate eve = LocalDate.of(today.getYear(), 12, 24);
기존 저장된 날짜 정보를 수정하는 것이 아니라, 변경된 날짜 정보를 갖는 LocalDate 인스턴스를 새로 생성해서 이를 반환
import java.time.LocalDate;
import java.time.Period;
public class Main4 {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
System.out.println(date);
LocalDate xmas = LocalDate.of(date.getYear(), 12, 25);
System.out.println(xmas);
Period left = Period.between(date, xmas);
System.out.println(left.getMonths() + left.getDays());
}
}
Period left = Period.between(date, xmas);
두 날짜의 차를 담은 period 인스턴스를 생성 할 수 있다.
LocalTime 클래스
import java.time.LocalDate;
import java.time.LocalTime;
public class Main5 {
public static void main(String[] args) {
LocalTime time = LocalTime.now();
System.out.println(time);
LocalTime mt = time.plusHours(2);
mt = mt.plusMinutes(10);
System.out.println(mt);
}
}
시각 정보를 나타내는 클래스.
LocalTime time = LocalTime.now();
현재 시각 정보를 담는 인스턴스
toString을 통해 문자열로 반환
LocalTime mt = time.plusHours(2);
기존 저장된 시각을 수정 X -> 변경된 시각 정보를 갖는 LocalTime 인스턴스를 새로 생성
LocalTime 인스턴스 사이의 시간 정보도 Duration 인스턴스로 표현
import java.time.Duration;
import java.time.LocalTime;
public class Main6 {
public static void main(String[] args) {
LocalTime start = LocalTime.of(14,24,35);
System.out.println(start);
LocalTime end = LocalTime.of(17,37,19);
System.out.println(end);
Duration between = Duration.between(start, end);
System.out.println(between);
}
}
LocatlDateTime
시각 정보와 날짜 정보를 동시에 나타낸다.
import java.time.LocalDateTime;
public class Main7 {
public static void main(String[] args) {
LocalDateTime dt = LocalDateTime.now();
System.out.println(dt);
LocalDateTime mt = dt.plusHours(22);
mt = mt.plusHours(35);
System.out.println(mt);
}
}
LocalDateTime 인스턴스도 변경 불가능한 인스턴스
시간 비교에 사용하는 LocalDateTime의 isBefore 메소드
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.Period;
public class Main8 {
public static void main(String[] args) {
LocalDateTime todat = LocalDateTime.of(2020, 4,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(todat.toLocalDate(), myFlight.toLocalDate());
Duration time = Duration.between(todat.toLocalDate(), myFlight.toLocalDate());
System.out.println(day);
System.out.println(time);
}
}
LocalDateTime todat = LocalDateTime.of(2020, 4,25,11,20);
연도, 월, 일, 시간, 분
if (flight1.isBefore(flight2))
myFlight = flight1;
else
myFlight = flight2;
시간 비교 어느 시간대가 앞선지.
Period는 날짜의 차이, Duration은 시각의 차이
만약 날짜와 시각의 관점에서만 계산하기 원한다면, 하루를 24시간으로 표현하기 원한다면,
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.Month;
public class Main9 {
public static void main(String[] args) {
LocalDateTime dt1 = LocalDateTime.of(2020, Month.JANUARY, 12,15,30);
LocalDateTime dt2 = LocalDateTime.of(2020, Month.FEBRUARY, 12,15,30);
LocalDateTime dt3 = LocalDateTime.of(2020, Month.FEBRUARY, 12,15,30);
LocalDateTime dt4 = LocalDateTime.of(2020, Month.FEBRUARY, 13,14,29);
Duration drDate1 = Duration.between(dt1, dt2);
System.out.println(drDate1);
Duration drDate2 = Duration.between(dt3, dt4);
System.out.println(drDate2);
}
}
LocalDateTime dt1 = LocalDateTime.of(2020, Month.JANUARY, 12,15,30);
LocalDateTime dt2 = LocalDateTime.of(2020, Month.FEBRUARY, 12,15,30);
Month.JANUARY를 전달하여 가독성을 개선 할 수 있다.
시간대를 적용한 코드 작성 & 출력 포맷 지정
세계 시간대.
시간대를 표현하는 ZoneId 클래스
import java.time.ZoneId;
public class Main10 {
public static void main(String[] args) {
ZoneId paris = ZoneId.of("Europe/Paris");
System.out.println(paris);
}
}
class ZonId2{
public static void main(String[] args) {
ZoneId.getAvailableZoneIds()
.stream()
.filter(s -> s.startsWith("Asia"))
.sorted()
.forEach(s -> System.out.println(s));
}
}
특정 시간대 정보를 담고 있는 ZoneId 인스턴스를 생성해야 한다. 파리 시간대를 적용하고 싶다면 “Europe/Paris” 전달해야 한다.
ZoneId.getAvailableZoneIds()
.stream()
.filter(s -> s.startsWith("Asia"))
.sorted()
.forEach(s -> System.out.println(s));
}
중간에 필요한 부분만 필터링 해서 본다.
시간대를 반영한 ZonedDateTime 클래스
import java.time.Duration;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main11 {
public static void main(String[] args) {
ZonedDateTime here = ZonedDateTime.now();
System.out.println(here);
ZonedDateTime paris = ZonedDateTime.of(
here.toLocalDateTime(), ZoneId.of("Europe/Paris")
);
System.out.println(paris);
Duration diff = Duration.between(here, paris);
System.out.println(diff);
}
}
ZonedDateTime -> 인스턴스별로 시간대 정보를 지정 할 수 있다.
ZonedDateTime here = ZonedDateTime.now();
인스턴스 생성
ZonedDateTime of (LocalDateTime localdateTime, ZoneId zone)
ZonedDateTime of (년, 월, 일, 시간, 분, 초 …. )
ZonedDateTime의 toLocalDateTime 메소드가 호출되면 시간대 정보가 생략된다. 날짜와 시간 정보만 LocalDateTime 인스턴스에 담아서 반환.
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main12 {
public static void main(String[] args) {
ZonedDateTime departure = ZonedDateTime.of(
LocalDateTime.of(2017, 12, 9,14,90),
ZoneId.of("Asia/Seoul"));
System.out.println(departure);
ZonedDateTime arrival = ZonedDateTime.of(
LocalDateTime.of(2017,12,9,17,25),
ZoneId.of("Euorpe/Paris"));
System.out.println(arrival);
System.out.println(Duration.between(departure, arrival));
}
}
날짜와 시각 정보의 출력
프로그램의 내용과 상황에 맞게 날짜와 시각 정보를 출력
public String format(DateTimeFormatter formatter)
format 메소드는 LocalDate, LocalTime, LocalDateTime, ZonedDateTime 클래스에 모두 정의.
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main13 {
public static void main(String[] args) {
ZonedDateTime date = ZonedDateTime.of(
LocalDateTime.of(2020,4,25,11,20),
ZoneId.of("Asia/Seoul")
);
DateTimeFormatter fm1 = DateTimeFormatter.ofPattern("yy-mm-dd");
DateTimeFormatter fm2 = DateTimeFormatter.ofPattern("yyyy-mm-d, H:m:s");
DateTimeFormatter fm3 = DateTimeFormatter.ofPattern("yyyy-mm-d, H:m:s VV");
System.out.println(date.format(fm1));
System.out.println(date.format(fm2));
System.out.println(date.format(fm3));
}
}
DateTimeFormatter fm1 = DateTimeFormatter.ofPattern("yy-mm-dd");
ofPattern 메소드를 호출해서 포멧 정보를 갖는 인스턴스를 생성한다.
“yy”는 끝에 두자리만 출력하라는 의미
“mm”이 두개 0을 붙여서 항상 출력 유지
“VV”는 시간대 ID를 출력을 의미 VV를 반드시 붙여서 출력