1. 날짜 시간 API 소개

날짜 시간 API 소개

Java 제작자는 Date 및 Calendar 클래스의 상황을 좋아하지 않았습니다. 그들은 당시에는 좋았지만 시대는 변합니다. 그리고 간단하고 강력하며 신뢰할 수 있는 것이 필요하게 되었습니다. 그리고 Java 8이 출시되면서( Calendar출시 15년 후) Java Date Time API 가 도입되었습니다. 시간을 다루는 모든 가능한 작업을 해결할 수 있어야 하는 클래스 세트입니다.

클래스가 너무 많아서 여러 패키지로 나뉩니다.

패키지 java.time는 Java Date Time API의 기본 패키지이며 LocalDate, LocalTime, LocalDateTime, Instant, Period및 와 같은 클래스를 포함합니다 Duration. 이러한 클래스의 모든 객체는 입니다 immutable. 즉, 생성 후에는 변경할 수 없습니다.

패키지 java.time.format에는 시간 형식화, 즉 시간(및 날짜)을 문자열로 또는 그 반대로 변환하기 위한 클래스가 포함되어 있습니다. DateTimeFormatter예를 들어 클래스 를 대체하는 다목적 클래스가 포함되어 있습니다 SimpleDateFormat.

패키지 java.time.zone에는 시간대 작업을 위한 클래스가 포함되어 있습니다. TimeZone및 와 같은 클래스를 포함합니다 ZonedDateTime. 세계 여러 곳에 위치한 클라이언트를 위한 서버 코드를 작성하는 경우 이러한 클래스가 실제로 필요합니다.


2. LocalDate클래스

우리가 살펴볼 Date Time API의 첫 번째이자 가장 유용한 클래스는 클래스입니다 LocalDate. 이름에서 짐작할 수 있듯이 이 클래스는 날짜와 함께 작동하도록 설계되었습니다.

이 클래스의 객체는 생성된 후에 변경되지 않습니다. 즉, 클래스 LocalDate는 변경할 수 없습니다. 그러나이 속성은 클래스에 단순성과 안정성을 추가합니다. 특히 여러 스레드(실행 스레드)가 이러한 개체와 동시에 상호 작용하는 경우.

새 개체를 만들려면 LocalDate정적 메서드 중 하나를 사용해야 합니다. 주요 목록은 다음과 같습니다.

현재 날짜 얻기

현재 날짜를 가져오려면 정적 메서드를 사용해야 합니다 now(). 보기보다 훨씬 쉽습니다.

LocalDate today = LocalDate.now();

여기서 todayLocalDate변수이고 클래스 의 LocalDate.now()정적 메서드에 대한 호출입니다 .now()LocalDate

예:

암호 콘솔 출력
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

특정 시간대의 날짜 가져오기

이 클래스 에는 특정 시간대의 현재 날짜를 가져올 수 있는 LocalDate다양한 메서드도 있습니다 .now(ZoneId)

이를 위해서는 클래스 ZoneId(java.time.ZoneId)라는 또 다른 클래스가 필요합니다. 시간대 이름이 지정된 객체를 of()반환하는 메서드가 있습니다 .ZoneId

상하이의 현재 날짜를 확인하려면 다음 코드를 작성해야 합니다.

암호 콘솔 출력
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

인터넷에서 모든 시간대의 이름 목록을 찾을 수 있습니다.


3. 특정 날짜 받기

특정 날짜를 나타내는 개체를 가져오려면 LocalDate정적 메서드를 사용해야 합니다 of(). 여기에 있는 모든 것도 매우 간단하고 명확합니다.

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

여기서 dateLocalDate변수이고 클래스 의 정적 메서드에 대한 호출입니다 .LocalDate.of()of()LocalDate

여기에서 2월을 월로 지정하는 데 사용되는 클래스(java.time.Month) FEBRUARY의 상수를 볼 수 있습니다 .Month

숫자를 사용하여 구식 방식으로 월을 지정할 수도 있습니다.

LocalDate date = LocalDate.of(2019, 2, 22);

둘? 2월 대신? 그것은 달이 다시 한 번부터 번호가 매겨진다는 것을 의미합니까?

예, Java가 생성된 지 거의 20년이 지난 지금 마침내 0부터 시작하여 개월 수를 세는 일이 중단되었습니다.

예:

암호 콘솔 출력
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

오늘의 인덱스로 날짜 구하기

날짜를 만드는 또 다른 흥미로운 방법이 있습니다. 이 ofYearDay방법을 사용하면 연도의 숫자와 해당 연도의 날짜 인덱스만을 기준으로 날짜를 얻을 수 있습니다. 일반적인 모습은 다음과 같습니다.

LocalDate date = LocalDate.ofYearDay(year, day);

year연도의 숫자는 어디에 있고 day연도의 날짜 인덱스입니다.

예:

암호 콘솔 출력
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

2019년 100일은 4월 10일입니다.

유닉스 날짜 얻기

Date1970년 1월 1일 이후 개체가 항상 시간을 밀리초로 저장한 것을 기억하십니까 ? 프로그래머가 옛날을 그리워하지 않도록 클래스에는 1970년 1월 1일부터 계산된 날짜를 반환하는 메서드 LocalDate가 있습니다. ofEpochDay()일반적인 모습은 다음과 같습니다.

LocalDate date = LocalDate.ofEpochDay(day);

day1970년 1월 1일 이후 경과된 일수는 어디에 있습니까?

예:

암호 콘솔 출력
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. 날짜 요소 가져오기

개체를 변경하는 것은 불가능 LocalDate하지만 저장된 날짜의 개별 요소를 가져올 수 있습니다. LocalDate개체에는 이를 위한 몇 가지 방법이 있습니다.

방법 설명
int getYear()
특정 날짜의 연도를 반환합니다.
Month getMonth()
날짜의 월 반환: 여러 상수 중 하나
JANUARY, FEBRUARY, ...;
int getMonthValue()
날짜의 월 인덱스를 반환합니다. 1월 == 1.
int getDayOfMonth()
해당 월의 일 인덱스를 반환합니다.
int getDayOfYear()
연초부터 일의 인덱스를 반환합니다.
DayOfWeek getDayOfWeek()
요일 반환: 여러 상수 중 하나
MONDAY, TUESDAY, ...;
IsoEra getEra()
시대를 반환합니다: BCE(현재 시대 이전) 및 CE(현재 시대)

예:

암호 콘솔 출력
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

LocalDate5. 개체 의 날짜 변경

클래스 LocalDate에는 날짜 작업을 수행할 수 있는 여러 메서드가 포함되어 있습니다. 이러한 메서드의 구현은 클래스의 메서드와 유사합니다 String. 기존 개체를 변경하지 않고 LocalDate대신 원하는 데이터가 있는 새 개체를 반환합니다.

클래스 의 메서드는 다음과 같습니다 LocalDate.

방법 설명
plusDays(int days)
날짜에 지정된 일수를 더합니다.
plusWeeks(int weeks)
날짜에 주를 추가합니다.
plusMonths(int months)
날짜에 월을 추가합니다.
plusYears(int years)
날짜에 연도 추가
minusDays(int days)
날짜에서 일을 뺍니다.
minusWeeks(int weeks)
날짜에서 주를 뺍니다.
minusMonths(int months)
날짜에서 월을 뺍니다.
minusYears(int years)
날짜에서 연도를 뺍니다.

예:

암호 콘솔 출력
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

우리가 호출하는 메서드는 birthday object변경되지 않습니다. 대신 해당 메서드는 원하는 데이터가 포함된 새 개체를 반환합니다.