시각과 날짜 처

황상익·2023년 12월 15일

열혈 자바

목록 보기
27/30

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를 반드시 붙여서 출력

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글